SpringSession DefaultCookieSerializer.setJvmRoute可以工作,但是HttpServletRequest没有必需的jvmRoute

时间:2018-08-16 02:10:58

标签: java servlets redis session-cookies spring-session

我在旧版Spring MVC应用程序中使用Redis实现了Spring Session。我还使用了DefaultCookieSerializer来设置jvmRoute,因为我需要一些与服务器有关的Talend作业才能运行。

当我运行前端并检查Chrome中的页面时,我看到在会话后附加了jvmRoute。如果将其从“ node1”编辑为“ node2”,则保留该会话。如果在部署期间重新部署服务器并发出请求,则会重定向到集群中的另一个节点,这意味着Spring Sessions可以完美地工作。

但是,我无法获得服务器关联性,因为调试Spring应用程序中的HttpServletRequest时,HttpServletRequest.getSession().getId()中没有jvmRoute(尽管十六进制是数字与我在Chrome中看到的数字匹配),这就是我传递给Talend职位的信息。

如果我返回到Tomcat会话并在jvmRoute的Engine组件中设置了server.xml,我会在Chrome和调试代码中看到jvmRoute附加在会话ID上

DefaultCookieSerializer到底是做什么的?我认为它会在创建cookie时对其进行编辑,这就是将cookie存储在Redis中的方式。因此,如果您以这种方式进行设置,那么在创建此cookie后,对它的任何使用都应附加jmvRoute

1 个答案:

答案 0 :(得分:1)

  

DefaultCookieSerializer到底能做什么?我认为它会在创建cookie时对其进行编辑,这就是将cookie存储在Redis中的方式。因此,如果您以这种方式进行设置,那么在创建此cookie后,对它的任何使用都应附加jmvRoute。

首先,重要的是要认识到cookie本身并未存储在会话存储中(即您的情况是Redis)。存储的是会话本身及其属性的表示。

除会话存储外,会话管理的另一个重要方面是用户的HTTP请求与存储的会话之间的关联。借助Spring Session的Servlet API支持,这是HttpSessionIdResolver的责任,默认情况下,Spring Session使用基于cookie的实现,即CookieHttpSessionIdResolverHeaderHttpSessionIdResolver中还有一个基于HTTP标头的实现。我之所以这样说是因为,重要的是要意识到会话存储是在不同级别上运行的独特关注点。

现在,关于CookieHttpSessionIdResolver,它将cookie的编写和读取问题委派给CookieSerializerDefaultCookieSerializer是……是默认的实现)。根据其配置,DefaultCookieSerializer在写入和读取会话cookie时会遵循许多选项,即cookie名称,是否使用Base64编码cookie值,是否使用httpOnly cookie指令等。

  

但是,我无法获得服务器关联性,因为在调试Spring应用程序中的HttpServletRequest时,HttpServletRequest.getSession()。getId()中没有jvmRoute(尽管十六进制数字与我匹配)在Chrome中查看),这就是我传递给Talend工作的内容。

这是我不了解的部分-如果您能够从当前的HttpSession中解析HttpServletRequest,那么您知道jvmRoute必然会正确吗?它是当前JVM的jvmRoute,否则将无法HttpServletRequest解决此JVM处理的会话。

Spring Session和Tomcat的会话管理之间的区别在于,对于Tomcat,jvmRoutesession id generation related concern,而对于Spring Session,jvmRoute用于会话cookie序列化。