Session对象代表一次会话,当客户端打开浏览器到关闭浏览器这期间的操作称为一次会话
Session的创建时间:当request调用getSession()时调用,同时将Session存入服务器的内存
Session的传递过程:当创建Session后,服务器会给该Session分配一个ID,同时会将该ID存入Cookie中,Cookie的名字为JSESSIONID,然后将此Cookie发送至客户端,当客户端继续发送请求时会附加上此Cookie,当服务器端继续调用getSession()方法时,会根据ID在服务器内存中查找此ID,如果找到了,那么就回调用此Session,如果没有找到,那么会新建一个Session对象
Session的销毁时机:当服务器退出时销毁,或者Session超时后销毁,或者Session调用invalidate()方法
默认情况下,当客户端退出浏览器后,Session的ID在Cookid中也会消失,当客户端开启第二次会话时,已经找不到上一次会话的Session对象了,但是服务器内存中还保留着上一次会话产生的Session,默认情况下Session在服务器内存中驻留30分钟,如何在第二次会话中继续使用上一次的Session呢?可以设置Session的ID,将Cookie的时间不设置为退出时销毁,例如:
HttpSession session = request.getSession();
session.setAttribute("text","session-text");
//覆盖Cookie的JSESSIONID
Cookie cookie = new Cookie("JSESSIONID",session.getId());
//设置Cookie存在时间
cookie.setMaxAge(1800);
//设置此Cookie的可以访问到的路径,整个web下的路径都可访问此Cookie
cookie.setPath(request.getContextPath());
因为Session是通过Cookie传递的,如果客户端关闭了浏览器中的Cookie功能,将浏览器设置为拦截所有Cookie,那么如何传递Session的ID呢?
HttpSession session = request.getSession();
session.setAttribute("text","session-text");
String url = "/day1121/test1.jsp";
//将url进行重写,重写后的url会在链接后附加Session的ID
url = response.encodeRedirectURL(url);
//重定向
response.sendRedirect(url);
注意:
//非重定向使用此方法重写url
String url = "/test1.jsp" ;
url = response.encodeURL(url);
//重定向使用此方法重写url
String url = "/day1121/test1.jsp";
url = response.encodeRedirectURL(url);
url重写后的示例:
http://localhost:8080/day1121/test1.jsp;jsessionid=8845ED0946D67A7BE8FDFC498FAE3480
这是服务器进行重定向后浏览器的URL地址栏的链接
注意:
encodeURL()和encodeRedirectURL()这两个方法会检测客户端是否禁止了Cookie,如果第一次使用此方法,检测到客户端没有禁用Cookie,继续使用此方法也不会在请求链接后附加Session的ID了