前言
如果说Cookie是保存在浏览器端的键值对数据,那么Session是保存在服务器端的键值对数据。对于一个新开的会话,服务器会开辟一块空间用来保存本次会话所要共享的数据,并返回一个sessionId,然后通过Cookie(“JSESSIONID”,sessionId)给浏览器保存。
- 每个Session会分配一个SessionID;Session存储键值对
- Sesson基于cookie,cookie保存sessionID以便找到对应的Session
- Session数据存储服务端,Cookie数据存储客户端
- Session与Cookie都有存活时间
Session原理
Session存取数据
session存数据的能力比cookie要强,session可以存储对象,cookie只能存储字符串,要存储对象要转化为json数据
//获取session对象
HttpSession session = request.getSession();
//存数据
//void setAttribute(String s, Object o)
session.setAttribute("country","中国");
//取数据
// Object getAttribute(String s)
session.getAttribute("country");
//获取session的编号jsessionId
String jsessionId = session.getId();
Session有效期设置
如果用户长时间未与服务端产生交互,服务端便会删除session。这个长时间tomcat默认是30分钟,当然可以更改这个时间。
setMaxInactiveInterval方法
void setMaxInactiveInterval(int i)//单位为秒
session.setMaxInactiveInterval(60*60);//session存活一小时
配置web.xml
单位为分钟,且必须为整数,如果是负数或零表示永不过期。
//存活60分钟
<session-config>
<session-timeout>60</session-timeout>
</session-config>
配置tomcat配置文件
打开tomcat目录下conf/web.xml配置文件,找到session-timeout元素,单位为分钟
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Session的注销
session对象的invalidate()方法可以删除属于自己的session,并删除所有数据。想要重新使用需要重新创建session。
HttpSession session = request.getSession();
session.invalidate();
Cookie被禁用,如何获取Session
URL重写和表单隐藏提交
URL地址重写的原理是将该用户Session的id信息重写到URL地址中,服务器能够解析重写后的URL获取Session的id。
//适合服务端重定向
String response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。
//适合前端向后端
String response.encodeURL(java.lang.String url)用于对表单action和超链接的url地址重写
这两个方法都可以自动对原有的url路径上附件上sessionID,再返回重写后的url。
String url = request.getContextPath+"/login/?id="+id;
url = response.encodeRedirectURL(url);
//url = /MyWeb/login;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=5
response.sendRedirect(url);
//encodeURL方法适合前端表单action和超链接的url地址进行重写
url = response.encodeURL(url);
//前端获取url
<a href='"url"'>链接<a>
手动使用Cookie保存SessionId
每次关闭浏览器,再访问项目,服务器会分配一个新的sessionId
如果关闭浏览器之后,再启动,如何访问到之前的session的数据(session数据保存30分钟)。
这个需要手动使用Cookie保存SessionId,设置较长的Cookie存活时间,但Cookie的键是固定的,必须是JSESSIONID,服务端只认这个,它发现有这个键,就能顺利的重新找到session。
//1 获取session对象
HttpSession session = request.getSession();
//2 获取session的编号jsessionId
String jsessionId = session.getId();
Cookie cookie = new Cookie("JSESSIONID",jsessionId);
//存活时间
cookie.setMaxAge(10*60);
//项目地址
cookie.setPath(request.getContextPath());
response.addCookie(cookie);