Cookie,Session
当前 Cookie有两个版本,分别对应两种设置响应头:“Set-Cookie”和 “Set-Cookie2”。在Servlet中并不支持Set-Cookie2,所以我们来看看Set-Cookie的属性项:
Domain
- 发送请求时与URL中请求域名一致的Domain加上对应的Cookie
- 如果没有显式的设置Domain,那么Domain的值为请求的域名,子域名将无法获取到这个cookie
- 当我们去请求一个URL时,浏览器会根据这个URL路径将符合条件的Cookie放在请求头中传给服务器。
Cookie分类
- 会话级别Cookie:所谓会话级别Cookie,就是在浏览器关闭之后Cookie就会失效。
- 持久级别Cookie:保存在硬盘的Cookie,只要设置了过期时间就是硬盘级别Cookie。
Session
Session是基于Cookie来工作的,同一个客户端每次访问服务器时,只要当浏览器在第一次访问服务器时,服务器设置一个id并保存一些信息(例如登陆就保存用户信息,视具体情况),并把这个id通过Cookie存到客户端,客户端每次和服务器交互时只传这个id,就可以实现维持浏览器和服务器的状态,而这个ID通常是NAME为JSESSIONID的一个Cookie。
SessionID传递
- 通过URL传递SessionID
- 通过Cookie传递SessionID
- 通过SSL传递SessionID
- 通过隐藏表单传递SessionID
session工作的时序图
创建
当客户端访问到服务器,服务器会为这个客户端创建一个Session,并添加到org.apache.catalina.Manager的sessions容器中保存,这就做到了对状态的保持。
- request.getSession() 如果当前SessionID还没有对应的HttpSession对象,就创建一个新的
- request.getSession(true) 强制创建一个新的Session
- request.getSession(false) 获取已有Session
销毁
当session创建后,浏览器关闭,会话级别的Cookie被销毁,如果没有超过设定时间,该SessionID对应的session是没有被销毁的。
主动销毁:session.invalidate()