会话技术(Session)

Mr.he...大约 3 分钟JavaWEBSession

1. 概念

服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。

2. 快速入门

2.1. 使用步骤

  1. 获取HttpSession对象; HttpSession session = request.getSession();
  2. 使用HttpSession对象。 Object getAttribute(String name):获取Session数据; void setAttribute(String name, Object value):存储数据; void removeAttribute(String name):移除Session。

2.2. 核心代码

  1. 获取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);
    }
}
  1. 使用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. 更多知识

  1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?

默认情况下不是。如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。

 Cookie c = new Cookie("JSESSIONID",session.getId());
 c.setMaxAge(60*60);
 response.addCookie(c);
  1. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
  • 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作:
    1. session的钝化:

在服务器正常关闭之前,将session对象序列化到硬盘上。

  2. session的活化:

在服务器启动后,将session文件转化为内存中的session对象即可。

只有单独使用tomcat服务器才起作用,在idea中不能完成session的活化。

  1. 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的特点

  1. session用于存储一次会话范围内多次请求的数据,存在服务器端;
  2. session可以存储任意类型,任意大小的数据。

6. session与Cookie的区别

  1. session存储数据在服务器端,Cookie在客户端;
  2. session没有数据大小限制,Cookie有。
  3. session数据安全,Cookie相对于不安全。