总结:会话跟踪技术

一、背景介绍

 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场景

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值