SpringBoot高级开发(9)Spring中的HttpSession

1、简述

HttpSession是javaWeb提供的,用来处理会话事务的。session数据保存在后台,当然首次开启会话(即调用req.getSession())的时候也会将该SessionID数值传给前端用作Cookie

2、作用范围

(1)首次访问服务器开始,浏览器关闭后就结束。
(2)Cookie层面没有过期时间,这个一个会话,expire的标识就是会话。且自动设置了HttpOnly。
https://img2024.cnblogs.com/blog/915194/202401/915194-20240129111940554-1574284602.png
【如果 Cookie 不包含到期日期,则将其视为会话 Cookie。会话 Cookie 存储在内存中,永远不会写入磁盘,当浏览器关闭时,此后 Cookie 将永久丢失。】
(3)后端的Session可以存储30分钟,如果30分钟无任何请求,就自动删除。期间有请求,就刷新过期时间。

3、流程

假设后端一个接口如下

    @RequestMapping("/test")
    public HashMap<String,Object> test(HttpServletRequest req) {
        HttpSession session = req.getSession();
        session.setAttribute("test", "no");
        return XXXXX;
    }

step1:前端首次访问/test,此时请求头不带任何Cookie。后端test函数接收到请求后,由于调用了req.getSession()函数,所以后端会创建一个session对象保存在后台,并且在请求返回之后自动给前端植入一个JSESSIONID=XXXXX的Cookie
step2:前端第二次访问的时候,此时请求头自动携带了JSESSION=XXXX的Cookie数据。此时后端的session就是step1中产生的session对象,对量里可以通过setAttr和getAttr来读写基于这个用户的数据。
step3:如果用户关闭浏览器。那么前端的这个JSESSIONID得Cookie就没了。后端的session对象,如果30分钟无任何请求,就自动删除。
此过程中,前端什么都不用做。

4、Session的缺点

(1)不适合负载均衡的场景
比如 A 服务器存储了 Session,就是做了负载均衡后,假如一段时间内 A 的访问量激增,会转发到 B 进行访问,但是 B 服务器并没有存储 A 的 Session,会导致 Session 的失效。

5、Session和Cookie的区别

这个主体,其实严格来讲是存在歧义的,或者这个问题就不该讨论。因为Session的实现方式本身就是通过Cookie实现的。不过如果忽略底层实现,是考虑抽象的上层,那么可以假设Session将用户的数据【userName age 等】保存在server端,Cookie将用户的数据【userName age 等】保存在Client端(实际大部分场景,Cookie跟Session一样,在Cookie只保存一个token串,不过这里就不钻牛角尖了)。
基于此,两者区别为:
(1)作用范围不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。
(2)存取方式的不同,Cookie 只能保存String,Session 可以存任意数据类型。
(3)有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭或者 Session 超时都会失效。
(4)隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。
(5)存储大小不同, 单个 Cookie 保存的数据不能超过 4K,同一域名下的cookie好像是20个。 Session 可存储数据远高于 Cookie,基本无限制。
(6)session的数据默认保存在内存里,通过get/getAttribute(),不过我们也可以自己构建后端存储方式,例如mysql,redis

6、HttpSession中的线程安全如何保证的?

暂未研究。

参考:
https://zhuanlan.zhihu.com/p/665717576
https://blog.csdn.net/m0_63217468/article/details/127426397

posted @ 2023-12-08 12:27  东方春  阅读(1127)  评论(0)    收藏  举报