我在旧版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
。
答案 0 :(得分:1)
DefaultCookieSerializer到底能做什么?我认为它会在创建cookie时对其进行编辑,这就是将cookie存储在Redis中的方式。因此,如果您以这种方式进行设置,那么在创建此cookie后,对它的任何使用都应附加jmvRoute。
首先,重要的是要认识到cookie本身并未存储在会话存储中(即您的情况是Redis)。存储的是会话本身及其属性的表示。
除会话存储外,会话管理的另一个重要方面是用户的HTTP请求与存储的会话之间的关联。借助Spring Session的Servlet API支持,这是HttpSessionIdResolver
的责任,默认情况下,Spring Session使用基于cookie的实现,即CookieHttpSessionIdResolver
。 HeaderHttpSessionIdResolver
中还有一个基于HTTP标头的实现。我之所以这样说是因为,重要的是要意识到会话存储是在不同级别上运行的独特关注点。
现在,关于CookieHttpSessionIdResolver
,它将cookie的编写和读取问题委派给CookieSerializer
(DefaultCookieSerializer
是……是默认的实现)。根据其配置,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,jvmRoute
是session id generation related concern,而对于Spring Session,jvmRoute
用于会话cookie序列化。