cookie与session

158 阅读3分钟

web应用中,我们所有的操作全部是浏览器,而浏览器和服务器之间采用的是http协议,而这种协议是 无状态的,所以这导致服务器无法知道是谁操作浏览器,但有一些操作是需要用户的状态。

为了解决这一问题,先后出现了四种技术,分别是隐藏表单域、URL重写,cookie,session,项目中使用最多的则是cookie和seesion。

  • cookie

cookie是浏览器保存在用户电脑上的一小段文本(有大小和数量显示的),通俗来说就是当一个用户通过http访问服务器是,服务器会将一些key/value键值对返回给客户端浏览器,并且在这些数据加上一些限制条件,在条件符合时这个用户在 下次访问这个服务器是,数据通过请求头又被完整的带回服务器,服务器根据这些信息来判断不同的用户.

  • cookie的创建

当前Cookie有两个版本,分别对应两种设置响应头:“Set-Cookie”和“Set-Cookie2”。在Servlet中并不支持Set-Cookie2,所以我们来看看Set-Cookie的属性项:


  • cookie的分类
  1. 回话级别cookie

所谓会话级别Cookie,就是在浏览器关闭之后Cookie就会失效。

  2. 持久级别cookie

保存在硬盘的Cookie,只要设置了过期时间就是硬盘级别Cookie。

  • session

session基于cookie来工作的,同一个客户端每次访问服务器是,只要当浏览器 在第一次访问服务器是,服务器设置一个id并保存一些信息,并且把这个id通过cookie村咋客户端,客户端每次和服务器交互式只传递id,就可以实现维持浏览器和服务器的状态,而这个id通常是name为JSESSIOND的一个cookie。

  • session和cookie

有四种方式让session正常工作

  1. 通过url传递sessionID
  2. 通过cookie传递SessionID
  3. 通过SSL传递SessionID
  4. 通过隐藏表单传递SessionID
  • 创建Session

客户端访问服务器时,服务器为这个客户端通过request.getSession()方法创建一个session。如果当前SeeionID还没有对应的HttpSession对象,将创建一个新的,并添加到org.apache.catalina.Manager的session容器中保存,这就做到了对应状态的保持。

  • session保存

session对象已经保存在了Manager类中,StandardManager作为实现类,通过requestedSessionId从StandardManager的sessions集合中取出StandardSession对象。

当Servlet容器关闭:

StandardManager将持久化没过期的StandardSession对象(必须调用Servlet容器中的stop和start命令,不能直接kill)


当Servlet容器重启时:

StandardManager初始化会重读这个文件,解析出所有session对象。

  • session的销毁

这里有一个误区,也是我之前的错误理解,就是我将session的生命周期理解成一次会话,浏览器打开就创建,浏览器关闭就销毁,这样理解是错的!!

session的声明周期是从创建到超时过期

也就是说,当session创建后,浏览器关闭,会话级别的Cookie被销毁,如果没有超过设定时间,该SessionID对应的session是没有被销毁的

检查session失效

检查每个Session是否失效是在Tomcat的一个后台线程完成的(backgroundProcess()方法中);除了后台进程检验session是否失效外,调用request.getSession()也会检查该session是否过期,当然,调用这种方法如果过期的话又会重新创建一个新的session。