关闭浏览器后依然可以访问原先的session区域
问题:把浏览器关闭了之后,session区域依然存在,但开浏览器却无法访问原来同一个session区域。
原因:jsessionid在浏览器关闭后自动销毁,重新开启浏览器后无法获取原来的jsessionid并查找原来的session区域。
补充:session生命周期
创建:第一次指定request.getSession();
销毁:服务器关闭、session失效/过期、手动session.invalidate();
解决方案:cookie默认是会话级别并可以存储到客户端中,可以将获取到的jsessionID存入当前cookie中并把cookie的生存时间设置久一些。重新打开浏览器后自动查找之前cookie内的jsessionID键并查找到对应的
jsessionID值,随后访问原来已存储到服务器session区域中的内容。
1 package session; 2 3 import java.io.IOException; 4 import javax.servlet.annotation.WebServlet; 5 import javax.servlet.ServletException; 6 import javax.servlet.http.Cookie; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 import javax.servlet.http.HttpSession; 11 12 @WebServlet("/session1") 13 public class seesionservlet1 extends HttpServlet { 14 private static final long serialVersionUID = 1L; 15 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) 17 throws ServletException, IOException { 18 19 //创建属于该客户端私有的session的区域 20 HttpSession session = request.getSession(); //request.getSession()内部判断客户端在服务器端是否有session存在,不存在则新建session,存在,调用并返回session 21 22 session.setAttribute("name", "jerry"); 23 24 String id = session.getId(); 25 26 //防止关闭浏览器后JESSION ID消失,把SESSION ID存入cookie中并为其设置持久化时间 27 Cookie cookie = new Cookie("JSESSIONID", id); 28 29 cookie.setPath("/"); 30 31 cookie.setMaxAge(60*10); 32 33 response.addCookie(cookie); 34 35 response.getWriter().write("JSESSIONID:" + id); 36 37 String cookieName = cookie.getName(); 38 String cookieValue = cookie.getValue(); 39 40 System.out.println(cookieName + " " + cookieValue); 41 } 42 43 protected void doPost(HttpServletRequest request, HttpServletResponse response) 44 throws ServletException, IOException { 45 46 doGet(request, response); 47 } 48 49 }
获取jsessionID并存入cookie
关闭并重新打开浏览器,找到cookie访问查找键JSESSIONID并获取其值
遇到问题
在设置cookie有效路径时,只有
cookie.setPath("/");
即设置成 Tomcat 下所有Web项目皆可访问该cookie,重新开启浏览器后才能找到该cookie,原因待查找。