概念

会话:指从一个浏览器窗口打开到关闭期间的一系列动作(可简单理解为用户开一个浏览器,点击多个链接,访问服务器多个web资源,然后关闭浏览器)。

HTTP协议是无状态协议:每次连接(比如同一个网站的多个页面)一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。

由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,而Session和Cookie就是为解决这个问题而提出来的两个机制。

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

Cookie

Cookie实际上是保存在客户端的一小段的文本信息。

客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围

  1. Name 和 Value 属性由程序设定,默认值都是空引用。
  2. Domain属性的默认值为当前URL的域名部分,不管发出这个cookie的页面在哪个目录下的。
  3. Path属性的默认值是根目录,即 ”/” ,不管发出这个cookie的页面在哪个目录下的。可以由程序设置为一定的路径来进一步限制此cookie的作用范围。
  4. Expires 属性,这个属性设置此Cookie 的过期日期和时间。
HttpCookie cookie = new HttpCookie("MyCook");//初使化并设置Cookie的名称
DateTime dt = DateTime.Now;
TimeSpan ts = new TimeSpan(0, 0, 1, 0, 0);//过期时间为1分钟
cookie.Expires = dt.Add(ts);//设置过期时间
cookie.Values.Add("userid", "value");
cookie.Values.Add("userid2", "value2");
Response.AppendCookie(cookie);

Path和Domain属性

Path:

Path就是跟在域名后面的URL路径,是在服务器创建Cookie时设置的,它的作用是决定浏览器访问服务器的某个资源时,需要将浏览器端保存的那些Cookie归还给服务器。假如有下面三个cookie:

  • Cookie1 路径:/Example/cookie
  • Cookie2 路径:/Example/
  • Cookie3 路径:/Example111/cookie

当浏览器访问服务器端的路径为:”http://localhost:8080/Example/cookie/a/index.jsp“时,也就是说index.jsp页面的访问路径为:”/Example/cookie/a/“,该路径包含了Cookie1和Cookie2的路径,因此在访问index.jsp时,浏览器会将Cookie1和Cookie2发送给服务器。

Domain:

Domain就是指的域名,一般是在多个二级域名共享cookie时才会使用,例如:
tieba.baidu.com news.baidu.com 这些域可以理解为百度的子项目,那么现在需要在百度的所有二级域名中去共享cookie,这个时候就需要设置cookie的域和路径:

  • 设置cookie的域:setDomain(“.baidu.com”),目的是对百度的所有二级域名有效;
  • 设置cookie的路径为根路径:setPath(“/”),目的是此路径下面的所有访问路径都带着这个cookie;

会话Cookie和持久Cookie

若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。

若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。这种称为持久Cookie。

Cookie具有不可跨域名性

就是说,浏览器访问百度不会带上谷歌的cookie。

Session

Session是存在服务器的一种用来存放用户数据的类HashTable结构。

当浏览器第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。

session的创建

当服务端需要为某个客户端的请求创建一个session时,服务端首先检查这个客户端的请求里是否已包含了Session ID,如果已包含则说明以前已经为此客户端创建过session,服务器就按照Session ID把这个session检索出来使用,如果客户端请求不包含Session ID,则为此客户端创建一个session并且生成一个与此session相关联的Session ID,Session ID的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个Session ID将被在本次响应中返回给客户端保存。

一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存到硬盘上,当服务器进程重新启动或这些信息将能够被再次使用。

session对象默认失效时间是30分钟,可以在web.xml文件中可以手工配置session的失效时间。

Session的客户端实现形式(即Session ID的保存方法)

一般浏览器提供了两种方式来保存,还有一种是程序员使用HTML隐藏域的方式自定义实现:

  1. 使用Cookie来保存,这是最常见的方法。服务器通过设置Cookie的方式将Session ID发送到浏览器。如果我们不设置这个过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个Session ID就丢失了。如果我们设置这个时间为若干天之后,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同样会发送到服务器上。
  2. 使用URL附加信息的方式,就是把Session ID直接附加在URL路径的后面。表现形式为“http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764”
  3. 表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>

如果客户端的浏览器禁用了Cookie,则使用第2、3种方式。

总结

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上。
  2. cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
  4. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
  5. 可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

参考:

Cookie的路径和域问题

Session机制详解

JavaWeb学习总结(十二)——Session

javaweb学习总结(十一)——使用Cookie进行会话管理

Cookie和Session的区别

Session和Cookie的区别与联系

认识cookie与session的区别与应用

最新文章

  1. javascript trigger触发事件
  2. 高级Swing——列表
  3. About JavaScript
  4. Java对象引用
  5. 喜大本\\ u0026普,微软的开源
  6. mac关机快捷键
  7. Qt之中文显示(QMessageBox、QLineEdit右键菜单等)
  8. 添加无登录权限的SSH用户命令
  9. deepin linux学习笔记(四)进不去图形界面怎么办?
  10. 通过案例了解Hystrix的各种基本使用方式
  11. pm2部署nodejs项目
  12. Matplotlib-动画
  13. js css样式操作代码(批量操作)
  14. ARC指南 strong和weak指针
  15. web基础 (一) http协议
  16. 批量MD5命名文件
  17. How to use jQuery countdown plugin
  18. matlab gradient 和 prctile
  19. nginx中的502错误
  20. shiro中部分SpringCache失效问题

热门文章

  1. 比特币交易本质--UTXO(Unspent Transaction Output)
  2. mq和redis安装
  3. php 判断查询结果是否为空
  4. glibc升级小记
  5. 【SSH】远程下载
  6. 【python】matplotlib中文乱码问题
  7. 显示图片中CDC和HDC问题
  8. mac os x 记录 转载
  9. ADT(Android Developer Tools)中配置SVN
  10. 使用HTML5 WebStorage API构建与.NET对应的会话机制