现象:多台tomcat服务器通过redis共享session,最近突然报“page need a session and none is available”异常
原因:多台服务器共享session使用的是tomcat-redis-session-manager.jar这个开源jar,
这个jar重写了catalina.jar下的ManmagerBase。
ManmagerBase.class
重写类 RedisSessionManager.class
tomcat会为了解决“固定会话攻击”,在ManmagerBase提供了一个changeSessionId方法,而RedisSessionManager没有重写这个方法。导致changeSessionId在取session时,直接从本地缓存里拿,而没有从redis里拿。
所以RedisSessionManager必须重写changeSessionId方法,才能解决特殊情况下调用changeSessionId后,出现session为null的情况。
重写的changeSessionId方法