Session原理分析以及Session的细节

Session原理分析以及Session的细节

Session原理分析:

Session的实现是依赖于Cookie的

 

 

 

当客户端第一次请求会话对象时,服务器会创建一个 Session 对象,并为该 Session 对象分配一个唯一的 SessionID (用来标识这个 Session 对象);
服务器将 SessionID 以 Cookie(Cookie 名称为:“ JSESSIONID ”,值为 SessionID 的值,如 Set-Cookie:JESSIONID=10 )的形式发送给客户端浏览器;
客户端浏览器再次发送 HTTP 请求时,会将携带 SessionID 的 Cookie (如 cookie: JESSIONID=10 )随请求一起发送给服务器;
服务器从请求中读取 SessionID,然后根据 SessionID 找到对应的 Session 对象。
在 同一次会话中 ,多次请求获取的是 同一个Session对象


注意:

  流程中的 Cookie 是容器自动生成的,它的 maxAge 属性取值为 -1,表示仅当前浏览器有效。
  浏览器关闭时,对应的 Session 并没有失效,但此时与此 Session 对应的 Cookie 已失效,导致浏览器无法再通过 Cookie 获取服务器端的 Session 对象。
  同一浏览器的不同窗口共享同一 Session 对象,但不同浏览器窗口之间不能共享 Session 对象。

 

Session的细节:

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

  默认情况下,不是

  如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久保存

package com.example.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet(name = "SessionDemo3", value = "/SessionDemo3")
public class SessionDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.获取session
        HttpSession session = request.getSession();

        System.out.println(session);

        //期待客户端关闭后,session也能相同
        Cookie c = new Cookie("JSESSIONID", session.getId());
        //生命周期
        c.setMaxAge(60 * 60);

        System.out.println(session);
    }
}

运行结果:

 

2.客户端不关闭,服务端关闭后,两次获取的session是同一个吗?

  不是同一个,但是要确保数据不丢失

    session的钝化:

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

    session的活化:

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

 

 

3.session什么时候被销毁?

  1.服务器关闭

  2.session对象调用invalidate()

  3.session默认失效时间 30分钟

    选择性配置修改

      在E:\apache-tomcat-9.0.39\conf\web.xml中修改

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

 

posted @ 2022-12-16 13:28  monkey大佬  阅读(104)  评论(0)    收藏  举报