session存储
在Java Web应用中,Session中保存的数据默认存储在服务器的运行内存中,但这并非唯一选择,具体存储位置取决于应用的配置和部署场景。
1. 默认情况:存储在服务器运行内存中
对于单体应用(单个服务器节点),Web容器(如Tomcat、Jetty)会为每个用户的Session分配一块内存空间,保存在服务器的JVM堆内存中。
- 优点:访问速度极快(内存操作),无需额外配置。
- 缺点:
- 受服务器内存大小限制,用户量过大时可能导致内存溢出。
- 服务器重启后,所有Session数据会丢失(内存数据非持久化)。
- 无法支持分布式部署(多个服务器节点之间内存不共享,用户请求切换节点后会丢失Session)。
2. 分布式场景:存储在数据库/缓存中
在分布式系统(多服务器节点部署)中,为了实现Session共享(比如用户请求可能被负载均衡分发到不同节点),会将Session数据持久化到共享存储中,常见方案包括:
- 缓存中间件:如Redis、Memcached(最常用)。
优势:性能接近内存,支持高并发,且可持久化到磁盘(Redis支持),兼顾速度和可靠性。 - 数据库:如MySQL、MongoDB。
优势:持久化能力强,但读写性能比缓存差,适合Session数据量小、对持久性要求极高的场景。 - 专门的Session服务器:如Spring Session结合Redis实现分布式Session管理。
3. Spring Security中的Session存储
Spring Security本身不直接管理Session的存储位置,而是依赖于底层Web容器(如Tomcat)或开发者配置的分布式Session方案。
- 当你在代码中通过
SecurityContextPersistenceFilter
将SecurityContext
存入Session时:- 若用默认配置,Session数据存在当前服务器的内存中。
- 若配置了分布式Session(如集成Spring Session + Redis),则会存入对应的共享存储(如Redis)。
总结
- 默认单体应用:Session数据存放在服务器运行内存中。
- 分布式应用:通常存放在缓存(如Redis)或数据库中,以实现多节点共享。
选择哪种存储方式,主要取决于应用的部署架构(单体/分布式)、性能需求和数据持久性要求。