简单聊一下面对tomcat集群,我们如何管理session。
使用nginx
第一种方法比较简单,比较笨,就是将session进行广播,多个tomcat互相广播session,即用户在一个tomcat登陆后,将这个tomcat保存的用户session信息,广播到其他tomcat里。这样子不管用户的请求分配给哪个tomact,都存有用户的session信息。
缺点:这无疑增加了每个tomact对内存的消耗。不可取。
第二种方法是,IP绑定。即nginx提供ip-hash功能,将固定的ip发起的请求始终分配给固定的tomcat来处理。那么这个tomcat就会存在该用户的session信息。
缺点:
1、一大堆人连同一个网访问的时候,就没有负载均衡这一说了,这一大堆的ip都是一样,都去访问同一个tomcat。
2、如果这个人访问的tomcat突然挂了,那nginx的故障转移机制将会分发给另一个tomcat服务器,这样一来所有请求这个tomcat的所有用户就又需要重新登入了。
3、如果这个人用着用着突然在用的网络不稳定,然后这个人换了另一个网,这样ip一换,这个人又要重新登入了。
使用redis
tomcat-redis-session-manager
多个tomcat上的应用,配置了同一个redis服务器,来存储session信息。达到了共享session的作用。
使用jwt
放弃session机制,使用jwt机制。简单来说就是userid+随机数+签名加密生成一个token,前后端通信通过token来交互。客户端第一次请求登入之后,服务器端给客户端一个token,服务器将token作为key值,userid作为value值,30分钟作为有效时间存入redis中;客户端第二次访问controller之前进行拦截,判断是否有token,如果有token解密获取userid,然后取查询redis,token和userid是否匹配,如果匹配就允许访问controller,请求返回之后,服务器将重新生成新的token返回给客户端。简单来说就是每次请求成功之后token都会改变,token存在redis中,这样一来至于redis分发到哪个tomat并不影响,因为token是存在redis中的。
这种服务模式就是一种用户的无状态服务。所写接口,均不判断用户是否登录,是否合法,只通过约定的秘钥来判断请求是否正确,只要正确,就提供返回结果。