业务场景分析
以往我们的项目都是部署在单台服务器运行,因为客户的所有请求都是由唯一服务器来处理, sessionld保存在这台服务器上是没有问题的但是当项目同时部署在多台服务器上时,就会出现 sessionld共享问题。
现在有两台服务器同时运行,分别是 Server A 和 Server B,通过 nginx配置了负载均衡,客户端的请求会被随机分配到两台服务器上进行处理假设客户现在有第一次请求(登录请求)被分配到 Server A进行处理, Serve A接受到请求之后会生成 sessionld并且保存到内存当中,然后返回给客户(浏览器),浏览器会把 sessionld保存到 cookie中,第一次请求完成。
如果之后每一次请求还是由 Server A处理当然一切正常,但是一旦出现意外(比如 Server A机)或者 nginx采用了轮询、 weight式负载均衡,请求被分配到 Server B进行处理,这时候 Server B拿到客户请求的 sessionld是由 Server A生成的,两边对不上啊!于是客户会发现,本来还用的好好的怎么会突然跳到登录页需要重新登录了呢???
实现思路
既然问题的根源出在 sessionld无法共享上面,那么是不是让 sessionld可以在多台服务器之间共享就可以了?换个思路,即把 sessionld保存到数据库即可(最终选择 redis因为会比较快!),验证时不再从当前服务器获取 sessionld改从 redis中获取即可
实现思路
- 登录页面提交用户名密码
- 登录成功后生成 token, Tokensessionid相当于原来的,字符串,可以使用uuid
- 把用户信息保存到 rediskey就 token是, valueuserid就是
- 设置key的过期时间。模拟 Session的过期时间。一般一个小时
- 拦截器拦截请求校验 sessionld.