JavaWeb 之 Session(会话) 总结

1. Session(会话)

Session 是一个会话级别的对象,一次会话对应一个HttpSession 对象。javax.servlet.http.HttpSession session,简称Session(会话)。

服务器会为每个用户创建一个Session,并存放在服务器端。

2. Session与Cookie 区别

Cookie 可以将会话状态保存在客户端,可以保存多个; Session 可以将会话状态保存在服务器端,保存重要信息,减少服务器资源浪费。

3. Session 的实现原理

思考:为什么当前会话的每一次请求可以获取到属于自己的会话对象?

    打开浏览器,在浏览器上首次发送请求; 服务器会创建一个HttpSession 对象,该对象代表一次会话;同时生成HttpSession 对象和与之对应的Cookie 对象,并且Cookie 对象的name 是JSESSIONID,Cookie 的Value 是32位长度的字符串; 服务器将Cookie 的Value 和HttpSession 对象绑定到Session 列表中; Session 列表:在Web 容器中有一个Session 列表,用于维护大量的HttpSession 对象。 服务器将Cookie 完整发送给浏览器客户端; 浏览器客户端将Cookie 保存到缓存中,只要浏览器不关闭,Cookie 不会消失; 当再次发送请求时,会自动提交缓存当中的Cookie; 服务器接收到Cookie,验证该Cookie 的name 是JESSIONID,然后获取Cookie 的value; 通过Cookie 的value 去Session 列表中检索对应的HttpSession 对象。

原理图:

4. 代码

public class SessionDemo01 extends HttpServlet {
          
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          
   
        // 获取Session
        HttpSession session = req.getSession();
        // 设置Session 的值
        session.setAttribute("username","chengyu");
        // 获取Session 的值
        Object username = session.getAttribute("username");
        // 获取SessionId
        String id = session.getId();
        System.out.println(id);
        // 判断是不是新的Session
        boolean aNew = session.isNew();
        System.out.println(aNew);
        // 手动注销Session
        session.invalidate();
    }
}
<session-config>
        <!--5分钟后 Session自动失效-->
        <session-timeout>5</session-timeout>
    </session-config>

5. 使用场景

    保存一个登陆用户的信息; 购物车信息; 在整个网站中经常使用的数据,保存在Session 中;
经验分享 程序员 微信小程序 职场和发展