一般有三种解决方案
- IP分流
- 会话复制
- 会话共享(推荐)
IP分流
这个技术我曾经在我的个人博客中用过,简单方便。
优点
- 服务端代码不用变
- Nginx只需要加个ip_hash的配置
缺点
- 会破坏Nginx的负载均衡
- 当某个服务器挂了的时候,服务器所在用户也会退出登录状态
- 服务器重启时,用户需要重新登录
会话复制
这个我没用过,据说就是把session在所有服务器上都复制一份,且服务器数量太多时容易出问题,由于没用过,暂不讨论。
会话共享
既然是共享,共享到哪?当然是共享到redis了。
缺点
- 实现麻烦
优点
- 不会破坏负载均衡
- 没有服务器节点的数量限制
拓扑图
实现
登录成功
- 生成一个定长的随机字符串作为JSESSIONID,当然了,随机字符串并不能保证唯一,所以在后面再加一个自增的数字,这个自增的数字可以放在redis中
- 用JSESSIONID作为key,用户信息作为value,有效期30分钟,存入redis
- 像客户浏览器中写入cookie,其key为“JSESSIONID”,value为JSESSIONID的值。
登录验证
- 从请求中找出key=“JSESSIONID”的cookie,用它的值作为key去redis中查找用户的登录信息。
验证码等用户零时信息
- 生成验证码
- 从请求中找出key=“JSESSIONID”的cookie,其实就是JSESSIONID
- 把验证码放入redis,他的key=JSESSIONID + “:code”,最好设置有效期
校验验证码
- 从请求中找出key=“JSESSIONID”的cookie,其实就是JSESSIONID
- 从redis中找出验证码,key=JSESSIONID + “:code”
- 用过之后删除redis中的验证码