我们知道在正常情况下,发送http请求时,消息头中会自动携带cookie信息,这其中就会包括SESSIONID信息,所以只要我们没有关闭浏览器,消息头中都会自动携带这个信息,以供服务器访问相应的session。
但是如果我把浏览器关闭了呢?这样的话,我该如何再次访问相应的session呢?
我们可以这样做,来实现这个需求(结合cookie)
//在servletA中设置cookie
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
session.setAttribute("name", "张三");
out.println("创建一个session并放入姓名属性");
//手动添加cookie,保存JSESSIONID信息
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*30);//设置cookie的生命周期为30min
相应 给浏览器一个 session id
response.addCookie(cookie);
}
//在servletB中就可以正常访问session了
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
HttpSession httpSession = request.getSession();
String name = (String) httpSession.getAttribute("name");
out.println("name = "+name);
}
我们来分析为什么可以这样做?
首先,session的声明周期是可以自己来设置的,默认的是30分钟,那么当我们关闭浏览器之后,这个浏览器对应的session其实还没有消亡,(如果我们需要它消亡的话,我们可以调用invalidate方法,这也是网站中的安全退出常见操作之一)。既然没有消亡,为什么关闭浏览器之后,我们就访问不到了呢?那是因为cookie中的JSESSIONID信息没有了,不会自动携带这个session信息了,服务器找不到对应的session,就会自动添加新的session,这个新添加的session显然不是我们需要的。所以,我们就可以利用cookie来实现这个需求。只要我们手动为cookie中添加JSESSIONID信息,那么不管你的浏览器是否关闭,我的cookie中都会携带JSESSION信息,这样的话,服务器就一定能够找到对应的session,而不会重新建立一个新的session,这样只要session没有消亡,就一定可以访问到对应的session。