一、背景介绍
HTTP 协议是一种无状态协议,在不同的请求间是无法进行数据传递的。此时就需要一种可以进行请求间数据传递的会话跟踪技术。
而Cookie和Session就是一种这样的技术。
二、什么是会话跟踪技术?
即用户登录网站了,服务端或客户端会记录登录信息,再访问网站的时候,就无需再登录了。
目前主要有:Session和Cookie两种技术。
Cookie:通过客户端记录会话信息;
Session:通过服务端记录用户会话信息;
三、Cookie
Cookie 是由服务器生成,保存在客户端的一种信息载体。这个载体中存放着用户访问该站点的会话状态信息。只要 Cookie 没有被清空或 Cookie没有失效,那么,保存在其中的会话状态就有效。
用户在提交第一次请求后,由服务器生成 Cookie,并将其封装到响应头中,以响应的形式发送给客户端。客户端接收到这个响应后,将 Cookie 保存到客户端。当客户端再次发送同类请求后,在请求中会携带保存在客户端的 Cookie 数据,发送到服务端,由服务器对会话进行跟踪。
在java中Cookie被当做类来处理。Cookie由两部分组成,分别是Cookie的name和value。
Cookie cookie1 = new Cookie("username","zhangshang");
Cookie cookie2 = new Cookie("password","1234567890");
服务端读取cookie:
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(Cookie cookie : cookies){
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
System.out.println(cookieName + "=" + cookieValue);
}
}
四、Session
1、介绍
Session即会话,是 Web 开发中的一种会话状态跟踪技术。
Session是由服务器创建的,并保存在服务器上的。在session创建好之后,会把sessionId放在cookie中返回(response)给客户端。返回的代码应该是这样子的。返回的cookie是保存在客户端的。返回的代码应该是这样子的。返回的cookie是保存在客户端的。
String sessionId = session.getId();
Cookie cookie = new Cookie("JSESSIONID", sessionId);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
若要对 Session 进行操作,则可以通过 HttpServletRequest 的 getSession()方法获取。
HttpSession session = request.getSession(); //获取当前的session,获取不到,则新建session
HttpSession session = request.getSession(true); //获取当前的session,获取不到,则新建session
HttpSession session = request.getSession(false); //获取当前的session,获取不到,则返回null
当session或cookie中任意一方过期,那么用户就需要重新登录了。
2、Session 的工作原理
在服务器中系统会为每个会话维护一个 Session。不同的会话,对应不同的 Session
1、打开浏览器,在浏览器上发送首次请求
2、服务器会创建一个HttpSession对象,该对象代表一次会话
3、同时生成HttpSession对象对应的Cookie对象,并且Cookie对象的name是JSESSIONID,Cookie的value是32位长度的字符串
4、服务器将Cookie的value和HttpSession对象绑定到session列表中
5、服务器将Cookie完整发送给浏览器客户端
6、浏览器客户端将Cookie保存到缓存中
7、只要浏览器不关闭,Cookie不会消失
8、当再次发送请求的时候,会自动提交缓存当中的Cookie
9、服务器接收到Cookie,验证该Cookie的name确实是:JSESSIONID,然后获取该Cookie的value
10、通过Cookie的value去session列表中检索对应的HttpSession对象。
3、Session对象的销毁
浏览器关闭之后,服务器不会销毁session对象。web系统中引入了session超时的概念。当很长一段时间(这个时间可以配置)没有用户再访问该session对象,此时session对象超时,web服务器自动回收session对象。
- 可配置:web.xml文件中,默认是30分钟
<session-config>
<session-timeout>120</session-timeout>
</session-config>
- session也可以手动销毁
HttpSession session = request.getSession(false);
if(session != null){
//销毁session
session.invalidate()
}
五、全局会话
服务由多台服务器组成,假设这次请求被转发到HostA,HostA记录了用户session,第二次请求被转发到HostB,没有记录session信息,难道要再让用户登录一次?显然不行,全局会话就是解决这个问题,即服务端会话信息共享。
SSO场景