Session会话追踪的实现机制

浅谈一下Session

      Session是指使用HttpSession对象实现会话跟踪的技术,是一种在服务器端保持会话跟踪的解决方案。HttpSession对象是javax.servlet.http.HttpSession接口的实例,也称为会话对象。

     客户端与服务器进行通信依靠HTTP协议,而HTTP协议是一种无状态的协议,服务器无需关心客户端是谁,每次都需要检查客户端的身份,这时就需要借助cookie来进行验证客户端的身份。

    服务器在创建会话对象时,会为其分配一个唯一的会话标识——SessionId,以“JSESSIONID”的属性名保存在客户端Cookie中,在用户随后的请求中,服务器通过读取Cookie中的JSESSIONID属性值来识别不同的用户,从而实现对每个用户的会话跟踪 。

Session和Cookie的主要区别在于:

  • Cookie是把用户的数据写给用户的浏览器。
  • Session技术把用户的数据写到用户独占的Session中   

会话追踪  

     session底层是依赖Cookie的,当首次使用session时,服务器端要创建session,session保存在服务器端缓存,而给客户端的是sessionid(一个cookie中保存了sessionid)客户端带走的是sessionid,而数据保存在session中。当客户端字词访问服务器是,在请求中会带上sessionid,而服务器会通过sessionid找到对应的session,而无需再创建新的session
 

       服务器识别 Session 的关键就是依靠一个名为 JSESSIONID 的 Cookie 。在Servlet 中第一次调用 req.getSession() 时, Servlet 容器自动创建一个 Session ID ,然后通过一个名为 JSESSIONID的Cookie 发送给浏览器 :

获取HttpSession对象

HttpServletRequest接口提供了获取HttpSession对象的方法

在程序中第一次执行request.getSession()时,服务器才会创建Session。 

    

HttpSession接口提供的方法

HttpSession接口提供了存取会话域属性和管理会话生命周期的方法:

 实现代码:

@WebServlet("/session.do")
public class SesstionServlet extends HttpServlet {

	// 获取会话
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		HttpSession session = req.getSession();

		System.out.println("sessionId:" + session.getId());
		System.out.println("session创建时间" + new Date(session.getCreationTime()));
		System.out.println("session最后访问" + new Date(session.getLastAccessedTime()));
	}
}

运行结果:

 session测试

产生”幸运数字“存入sessionid

@WebServlet("/three.do")
public class ThreeServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 本次请求的request,获取当前对话HttpSession
		HttpSession session = req.getSession();
		System.out.println("本次会话:" + session.getId());

		// 产生幸运数字,并存入当前会话
		int luckNumber = (int) (Math.random() * 100);
		System.out.println("幸运数字:" + luckNumber);

		session.setAttribute(session.getId(), luckNumber);
	}
}

获取幸运数字 根据sessionid(注意是同一个sessionid)

@WebServlet("/test.do")
public class TestSessionServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		HttpSession session = req.getSession();
		System.out.println("本次会话:" + session.getId());

		// 获取会话中”保存的数字“
		String result = String.valueOf(session.getAttribute(session.getId()));

		// 响应输出
		PrintWriter out = resp.getWriter();
		out.write(result);
		out.flush();
	}

}

Session生命周期

     Session失效时间:Session具有一定声生命周期,如果Session超过会话的最大不活动时间,会话自动失效,会话的最大不活动时间指会话超过此时间段不进行任何操作。
设置Session的失效时间。
        方法1:在工程的web.xml中配置Session的生命周期,单位为分钟。
<Session-config><Session-timeout>15</Session-timeout></Session-config>
        方法2:在程序硬编码设置。
Session.setMaxInactiveInterval(30 * 60); //设置单位为秒,设置为-1永不过期;
         方法3:在Tomcat安装目录下conf/web.xml中配置(Web容器级别)。
<Session-config><Session-timeout>15</Session-timeout></Session-config>
手动销毁Session:可以通过调用invalidate()方法立即清除会话对象及其所有会话域属。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值