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

Java SpringSession DefaultCookieSerializer.setJvmRoute可以工作,但HttpServletRequest没有所需的jvmRoute,java,servlets,redis,session-cookies,spring-session,Java,Servlets,Redis,Session Cookies,Spring Session,我已经在遗留的Spring MVC应用程序中使用Redis实现了Spring会话。我还使用了DefaultCookieSerializer来设置jvmRoute,因为我需要一些服务器关联才能运行Talend作业 当我运行前端并在Chrome中检查页面时,我看到会话附加了jvmRoute。如果我将其从“node1”编辑为“node2”,会话将被保留。如果我重新部署服务器并在部署期间发出请求,我会被重定向到集群中的另一个节点,这意味着Spring会话工作得非常好 但是,我无法获得服务器关联性,因为当

我已经在遗留的Spring MVC应用程序中使用Redis实现了Spring会话。我还使用了
DefaultCookieSerializer
来设置
jvmRoute
,因为我需要一些服务器关联才能运行Talend作业

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

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

如果我返回到Tomcat会话,并在
server.xml
的引擎组件中设置
jvmRoute
,我会在Chrome和调试代码时看到
jvmRoute
附加到会话id中

DefaultCookieSerializer
的具体功能是什么?我认为它会在创建cookie时编辑cookie,这就是cookie在
Redis
中的存储方式。因此,如果以这种方式设置,则在创建之后使用此cookie时应附加
jmvRoute

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

首先,重要的是要认识到cookie本身并不存储在会话存储中(例如,在您的例子中是Redis)。存储的是会话本身的表示及其属性

除了会话存储,会话管理的另一个重要方面是用户的HTTP请求与存储的会话之间的关联。通过Spring会话的Servlet API支持,这是
HttpSessiondResolver
的责任,默认情况下,Spring会话使用基于cookie的实现,即
CookieHttpSessiondResolver
HeaderHttpSessionIdResolver
中还有一个基于HTTP头的实现。我这样说是因为认识到会话存储是在不同级别上运行的不同关注点,这一点很重要

现在,关于
CookieHttpSessiondResolver
,它将cookie写入和读取问题委托给
CookieSerializer
(默认CookieSerializer是默认实现)。根据其配置,
DefaultCookieSerializer
在写入和读取会话cookie时将考虑许多选项,即cookie名称、是否Base64编码cookie值、是否使用
httpOnly
cookie指令等

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

这是我不理解的部分-如果您能够从当前的
HttpServletRequest
解析
HttpSession
,那么您知道什么是
jvmRoute
吗?它是当前JVM的
jvmRoute
,否则会话将不会在该JVM处理中解析
HttpServletRequest


Spring会话和Tomcat会话管理之间的不同之处在于,使用Tomcat时,
jvmRoute
是,而使用Spring会话时,
jvmRoute
是在会话cookie序列化的上下文中使用的。

我明白你的意思,但我希望jvmRoute附加到会话中的原因是,如果我将其作为字符串传递给Talend(使用脚本),那么这个jvmRoute将用于我的Talend对我的应用程序进行更多调用。我需要服务器关联,因为有一些生成的文件存储在本地。是否有可以调试的特定筛选器将路由从会话ID中剥离?我认为这是必然发生的事情,因为为什么客户端拥有它而服务器没有呢?换句话说,在春天,HttpSession在什么时候从cookie中设置了sessionId,我可以防止jvmRoute的修剪吗?我试图在回答中解释,Spring Session
jvmRoute
是cookie序列化的一个方面,因此考虑配置的
jvmRoute
的逻辑是
DefaultCookieSerializer
。但是,如果您已经从当前请求解析了会话,那么您就知道它绑定到当前JVM的是什么。然后,在将其传递给下游应用程序之前,您只需将其附加到会话id中即可。我遗漏了什么吗?是的,我完全理解你。我可以从主机名确定代码中任何地方的JvmRoute。然而,我传递给Talend的sessionId是一个复杂字符串,其中HttpSession标识符只是它的一部分。这意味着我必须拆分字符串,插入jvmRoute并重新组装标识符。没什么大不了的,只是几行代码。但是,我们打算在明年从应用程序中删除粘性会话,所以我希望不必再次访问代码的这一部分。我已经向Spring开了一张罚单,看看他们是否会实现我想要的。