1. 概念
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象HttpSession中。
获取session对象
1
2//获取session
HttpSession session = request.getSession();使用HttpSession对象方法
- Object getAttribute(String name)
- void setAttribute(String name,Object value)
- void removeAttribute(String name)
2.原理
session的实现是依赖于cookie的。
客户端浏览器访问服务器SessionDemo1资源时,该资源doget或者doPost方法中如果是第一次使用request.getSeesion()获取session对象,会在内存中创建一个session对象,并赋予一个ID值,服务器端的响应消息中携带set-cookie:JSESSION=ID值,浏览器保存该信息为cookie中。
当客户端再次访问服务器资源时,再请求消息中包含cookie:JSESSION=ID值信息,服务器端再次使用request.getSeesion()获取session信息会在内存中查找是否有对应ID值的session对象。
3.session细节
当客户端关闭后,服务器端不关闭,两次获取session是否为同一个?
- 默认情况下 不是
- 如果需要获取同一个对象,则可以创建cookie,键为JSESSION,设置最大存活时间,让cookie持久化保存
1
2
3
4
5
6
7
8
9
10
11
12protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session
HttpSession session = request.getSession();
System.out.println(session);
//获取数据
Object msg = session.getAttribute("msg");
//手动将cookie JSESSIONID修改为当前session ID
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60);
response.addCookie(cookie);
System.out.println(msg);
}
客户端不关闭,服务器关闭后,两次获取的session时同一个吗?
不是同一个,但是要确保数据不丢失
session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
session的活化:在服务器启动后,将session文件转化为内存中的session对象即可,原session中数据不会丢失,但是session对象ID不一样。
tomcat服务器会自动进行钝化和活化,SESSION.ser文件存放在服务器安装目录下的work目录中,但是IDEA钝化时会将SESSION.ser文件存放在web项目CATALINA_BASE目录下的\work\Catalina\localhost\项目名称文件夹中,但是重新启动服务器时会先删除work目录,然后重新建立一个work目录,所以不会活化。
session的失效时间
- 服务器关闭
- session对象调用invaliddate()
- session默认失效时间 30分钟,也可以在tomcat安装目录下的conf文件夹中的web.xml进行设置
1
2
3<session-config>
<session-timeout>30</session-timeout>
</session-config>
4.session和cookie的区别
session运行在服务器端,cookie运行在客户端
cookie有大小和个数限制,session没有大小限制,而是和服务器的内存大小有关
cookie有安全隐患,通过拦截或本地文件找到cookie后来可以进行攻击
session保存在服务器一段时间后才会消失,session过多会增加服务器的压力