会话技术(Session)
...大约 3 分钟
1. 概念
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
2. 快速入门
2.1. 使用步骤
- 获取HttpSession对象;
HttpSession session = request.getSession();
- 使用HttpSession对象。
Object getAttribute(String name)
:获取Session数据;void setAttribute(String name, Object value)
:存储数据;void removeAttribute(String name)
:移除Session。
2.2. 核心代码
- 获取HttpSession对象:
package io.gitee.hek97.session;
//去掉导包代码
@WebServlet("/sessionDemo1")
public class SessionDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取session
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute("msg","hello session");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
- 使用HttpSession对象:
package io.gitee.hek97.session
//去掉导包代码
@WebServlet("/sessionDemo2")
public class SessionDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取session
HttpSession session = request.getSession();
//2.获取数据
Object msg = session.getAttribute("msg");
System.out.println(msg);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3. 保证获取同一个session对象的原理
Session的实现是依赖于Cookie的。在服务器的一次会话范围内,第一次获取Session对象时,不存在键为JSESSIONID的Cooike,这时会在内存中创建一个新的Session对象,并拥有一个键为JSESSIONID,值为随机数的Cooike对象,然后把该Cookie对象响应给客户端保存,再次获取Session对象时,客户端发送的请求头中存在键为JSESSIONID的Cookie对象,然后服务器会根据该Cookie对象的值获取到第一次使用的Session对象并使用该Session对象,以此保证在同一次会话范围内,获取同一个Session对象。
4. 更多知识
- 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
默认情况下不是。如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
- 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
- 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作:
- session的钝化:
在服务器正常关闭之前,将session对象序列化到硬盘上。
2. session的活化:
在服务器启动后,将session文件转化为内存中的session对象即可。
只有单独使用tomcat服务器才起作用,在idea中不能完成session的活化。
- session什么时候被销毁? 服务器关闭时调用
invalidate()
方法进行销毁session对象。session默认失效时间为30分钟,可修改tomcat服务器安装目录下的/conf/web.xml文件,修改如下代码:
//apache-tomcat-8.5.31/conf/web.xml
<session*config>
<session*timeout>30</session*timeout>
</session*config>
5. session的特点
- session用于存储一次会话范围内多次请求的数据,存在服务器端;
- session可以存储任意类型,任意大小的数据。
6. session与Cookie的区别
- session存储数据在服务器端,Cookie在客户端;
- session没有数据大小限制,Cookie有。
- session数据安全,Cookie相对于不安全。