Java SpringSession DefaultCookieSerializer.setJvmRoute可以工作,但HttpServletRequest没有所需的jvmRoute
我已经在遗留的Spring MVC应用程序中使用Redis实现了Spring会话。我还使用了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会话工作得非常好 但是,我无法获得服务器关联性,因为当
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 SessionjvmRoute
是cookie序列化的一个方面,因此考虑配置的jvmRoute
的逻辑是DefaultCookieSerializer
。但是,如果您已经从当前请求解析了会话,那么您就知道它绑定到当前JVM的是什么。然后,在将其传递给下游应用程序之前,您只需将其附加到会话id中即可。我遗漏了什么吗?是的,我完全理解你。我可以从主机名确定代码中任何地方的JvmRoute。然而,我传递给Talend的sessionId是一个复杂字符串,其中HttpSession标识符只是它的一部分。这意味着我必须拆分字符串,插入jvmRoute并重新组装标识符。没什么大不了的,只是几行代码。但是,我们打算在明年从应用程序中删除粘性会话,所以我希望不必再次访问代码的这一部分。我已经向Spring开了一张罚单,看看他们是否会实现我想要的。