跳到主要内容

21--会话管理之实现集群会话

前言

现在我们已经掌握了如何防御会话固定攻击,处理会话过期,对会话进行并发控制等,但是这些会话处理手段都是针对单机环境下的,在现在的大型项目中,很多时候都是采用分布式开发方案。一旦涉及到分布式方案,就意味着我们的服务器可能会有多台,而我们的项目也可能会根据业务被拆分成了若干个子服务,每个服务又可能被部署在不同的服务器上。这时候问题就来了,以前单台服务器的时候,我们的会话很好管理,现在有多台服务器,那会话岂不是有多个了?这时候我们把服务器集群环境下的会话和单个用户关联起来?

啊啊啊...是不是感觉很复杂!

别害怕!Spring Security其实给我们提供了对应的解决方案,就是 一一哥 今天要讲的集群会话管理,来跟着我一起学习吧。

一. 集群会话

1. 集群会话概念

咱们先来看看集群会话的概念。

我们上一章节给大家讲解了会话Session的概念,知道会话Session通常是保存在服务器的内存中的,在客户端访问时根据自己的sessionId在内存中查找。

这种方法虽然简单快捷,但是缺点也很明显:

> - 从容量上来说,服务器内存有限,除了系统正常运行的消耗,留给session的空间不多,当访问量增大时,内存就会捉襟见肘。 > - 从稳定性上来说,Session依赖于内存,而内存并非持久性存储容器,就算服务器本身是可靠的,但当部署在上面的服务停止或重启时,也会导致所有会话状态丢失。

当然以上这两个缺点只是体验性的缺陷,并不足以影响可用性,所以为了节省成本,我们一般就单机部署即可。但是如果我们为了提高服务器的Session容量,提高可用性,就可以考虑搭建服务器集群,在集群环境中的会话,就是我们所谓的集群会话

2. 集群会话的缺陷

那么在服务器集群中,会话的使用是不是和以前单机环境的会话一样呢?这个还真不完全一样!

在传统的单服务架构中,一般来说,如果只有一个服务器,就不存在 Session 共享问题。但是在分布式/集群项目中,Session共享 则是一个必须面对的问题,先看一个简单的架构图: