受到http://docs.hazelcast.org/docs/latest/manual/html/websessionreplication.html的启发,我决定尝试在Spring MVC + Security应用程序中使用它。
我遇到的第一个问题是 - Hazelcast抱怨它无法找到sessionRegistry
bean。通过将以下bean添加到spring-security context
<bean id="sessionRegistry"
class="org.springframework.security.core.session.SessionRegistryImpl" />
但是我马上打了下一期,仍然无法解决。 这就是:
JSESSIONID
和REMEMBER_ME_TOKEN
Cookie已清除,但hazelcast.sessionId
Cookie 不已清除)invalidSessionStrategy
发生经过一些调试后,我发现了几个事实:
SessionManagementFilter#doFilter
内检查request.isRequestedSessionIdValid()
会返回false
JSESSIONID
和hazelcast.sessionId
不同(我假设设计)request.isRequestedSessionIdValid()
和request.getSession()
之间的不一致 - 看起来如果前者返回false
,那么后者假设创建新会话 - 这不会发生到目前为止我尝试了什么(并没有帮助):
hazelcast.sessionId
cookie(没有成功,coockie再次显示相同的值)HttpSessionDestroyedEvent
。没有注意到效果JSESSIONID
作为hazelcast cookie名称的会话ID(在这种情况下,我只能打开一次ap,所有后续请求都会导致无限重定向到invalid-session
)所以......显然它并不像官方Hazelcast文档中所说的那么简单。任何想法如何使它工作?
答案 0 :(得分:1)
所以看起来我找到了解决infinite redirect to invalid session
问题的方法。我不确定它是否是捷径,或者它是100%正确的方式......
我使用以下代码创建了自定义InvalidSessionStrategyImpl
:
@Override
public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
if (request.getSession(false) instanceof HazelcastHttpSession) {
HazelcastHttpSession hazelCastSession = (HazelcastHttpSession) request.getSession(false);
hazelCastSession.invalidate();
} else {
request.getSession();
}
redirectStrategy.sendRedirect(request, response, redirecctTo);
}
P.S。如果你好奇 - 在那之后我遇到了另一个问题:CPU消耗过多。 Hazelcast吃掉100%的CPU。完全不可接受的问题(特别是对于像Jelastic那样按资源使用情况付费的云部署)。