Session和Cookie这两个对象也接触了比較长的时间了,今天就来总结一下。

首先,他们都是会话跟踪中经常使用的技术。Cookie在client记录信息来确定用户身份,Session在服务端记录信息来确定用户。

这篇文章将系统解说Cookie与Session的机制、使用场景和实例。

Cookie机制

Cookie的产生:当两个用户都用訪问了同一个购物站点,訪问结束关闭浏览器后,假设用http协议传输Web数据,client和server的连接就关闭了,此时不能保存会话状态。

也就是说假设用户A在该站点下了订单,下次A或B再訪问时server不能确定是谁下的订单了。

这显然行不通。所以就须要使用一种机制来记录究竟是谁下了订单。

此时,就用到了Cookie。

Cookie实际上是一小段的文本信息。

client请求server,假设server须要记录该用户状态,就使用Response向client浏览器发送一个Cookie。client浏览器会把Cookie保存起来。

当浏览器再请求该站点时,浏览器把请求的网址连同该Cookie一同提交给server。server检查该Cookie,以此来辨认用户状态。

server还能够依据须要改动Cookie的内容。

结合上面的样例,就是server给每一个登陆用户发一张验证卡,卡号是唯一的、随机生成的,到时候用户持卡去服务端验证,通过后就能够读取个人信息了。

Cookie的特点

1、能记录用户登陆信息、经常使用浏览器信息和訪问次数。

这也是部分商家所看重的、导致cookie不安全的因素。由于我们能够在訪问server过程中截取cookie,如通过request.getCookie()方法。

2、能保存Unicode、ASCII字符和二进制内容。也就意味着能够保存中文或二进制图片,保存中文或图片时必须对其进行编码。当然,因为每次訪问server都要传一次cookie。所以不提倡cookie中带有大量内容,会影响效率。

3、Cookie操作。包含增删改查。

添加和查询cookie非常easy。用Request.getCookie()和Response.addCookie(Cookiecookie)方法就能够了。Cookie本身并不提供改动、删除操作。

改动的话,仅仅须要新建一个同名的Cookie,加入到response中覆盖原来的Cookie中。假设要删除某个Cookie,新建一个同名的Cookie后,将maxAge设置为0,并加入到response中覆盖原来的Cookie就可以。

点击链接进入: Cookie使用实例

Session机制

Session也是保存client用户信息的一种方式,仅仅是它保存在服务端。

当client浏览器訪问server时,server会记录訪问信息。当用户再次訪问时,仅仅须要从session中查找该用户状态就能够了。

Session的特点

1、创建和读写。Session在第一次訪问server,且訪问资源为非静态(如JSP,Servlet)时会被创建,每一个用户相应一个。Java中。都是通过K-V键值对形式存在,通过GetAttribute()和SetAttribute()方法来读写。

2、有效期。

为了保证高速读取,Session被放在了内存中,然而当数量随着用户訪问量的增长而高速增长时,就可能发生Session过多而内存溢出。

解决方式:1、尽量精简Session信息;2、server定时删除长时间不活跃的Session,也就是设置Session有效期。

Session生成后,仅仅要用户訪问了。就会更新为最新时间。活跃时间以此为基础。

3、依赖SessionID。依据Http无状态协议server是无法推断新的訪问来自哪个用户,因此须要在client发送的Cookie中存入一个SessionID,用以辨别用户身份和获取资源。SessionID由server端创建而保存在浏览器端。

有的浏览器考虑安全性等因素。并不支持cookie,因此能够使用URL地址重写来保存SessionID,发送到server。

Session使用实例

Cookie与Session的异同点比較

同样点:

1、都能够保存client用户信息;

2、都不应保存内容过多;

3、都存在有效期。

不同点:

1、保存地址不同,cookie在client,Session在服务端;

2、Session安全性较好。

使用场景分析

1、考虑安全性时,尽量用Session;考虑server性能时,尽量用Cookie;

2、二者结合,能够我们把重要的。如登陆信息放入Session。把其它信息放入Cookie。

小结:事实上他们的使用都非常easy,仅仅要弄清原理,就依照手冊查下使用方法就能够了,终于还是要归于实践。

最新文章

  1. [CareerCup] 2.5 Add Two Numbers 两个数字相加
  2. DOM元素的大小和位置
  3. Redux介绍及基本应用
  4. 小白日记25:kali渗透测试之提权(五)--利用配置不当提权
  5. MongoDB:The Definitive Guide CHAPTER 2 Getting Started
  6. ORA-01652:无法通过128(在表空间TEMP中)扩展temp段
  7. 【转】十款让 Web 前端开发人员更轻松的实用工具
  8. mac如何进入应用程序的内部文件夹?
  9. [C#]使用Process的StandardInput与StandardOutput写入读取控制台数据
  10. 如何解决更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外 提示:一个版本库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更 提示:(如 'git pull ...')。
  11. 在网页中使用particlesjs实现背景的动态粒子特效
  12. 【MySQL】percona-toolkit工具包
  13. IntelliJ IDEA 调试技巧
  14. android源码追踪学习 RecipientsEditor
  15. String、StringBuffer与StringBuilder之间区别(转)
  16. Python设计模式(六大)
  17. unity热更新
  18. 后门技术和Linux LKM Rootkit详解
  19. 【UVa】Palindromic Subsequence(dp+字典序)
  20. jQuery 中的 unbind() 方法

热门文章

  1. shellinabox的安装使用
  2. React和webpack解决 waiting for roots to load...to reload the inspector
  3. CE工具里自带的学习工具--第三关
  4. 0.ssm web项目中的遇到的坑
  5. UML-画类图与交互图的顺序
  6. 解决java web项目导入后出现的问题 ---cannot be read or is not a valid ZIP file
  7. js中5中继承方式分析
  8. Python数据类型方法
  9. 22Spring基于配置文件的方式配置AOP
  10. PHP:分页类(比较庞大不建议在项目中用)