【发布时间】:2018-02-24 17:20:35
【问题描述】:
我们在 Ubuntu 16.x 下安装的 Tomcat 8.0.32 有一个非常奇怪的问题。
这个问题开始是偶然发生的,直到tomcat服务器重新启动才存在(所以它开始发生后是可以重现的)。
发生的情况是,定时器从具有正确cookie: JSESSIONID= 值的 JS 应用程序发送的一些请求未正确处理:Tomcat 找不到Session 对象(来自Spring MVC 层,这意味着该用户未通过身份验证)。所有具有相同 JSESSIONID 的请求在此中断请求之前发送,所有请求在之后发送(同样具有相同的会话 ID 值) - 它们都工作正常!
我们当然也看到该请求中的所有标头都是正确的(它们由我们的应用程序在某些过滤器中打印出来),但Session 对象没有恢复。
所以基本上听起来在某些情况下 Tomcat 开始忽略来自另一台服务器通过重定向发送的请求中的 JSESSIONID。再说一次,这并不总是发生,只有在 Web 应用程序生命的一段时间后才会发生。
我不会在这里提供任何代码或配置设置。首先,因为它看起来像 Tomcat 的问题,其次,因为配置是标准的(apt-install 后开箱即用)。
我的问题是:我们如何配置 Tomcat 以记录与 JSESSIONID 处理相关的所有操作?就像它找到给定 ID 的会话一样,或者没有,依此类推。
UPD:在 Tomcat 8.5.5 的更新版本中永远不会发生这种情况。但由于某些原因,它无法在该特定服务器上更新。我目前的目标是收集有关此行为的证据,以确保它是一个错误,或者是 Tomcat 安装的一些奇怪的默认配置。
【问题讨论】:
-
我对 Tomcat HTTP 请求的日志记录不太熟悉。通常,我的 Java 服务器位于反向代理(如 nginx)后面。首先看看 Tomcat 能做什么,如果还不够,可以考虑在两者之间放置 nginx(或其他反向代理)来提供日志记录。
-
或者,你的意思是 nginx 代理,一直在 Tomcat 中,可以以某种方式处理会话?
-
你会把 Tomcat 放在 nginx 后面,而不是反过来。 Tomcat 必须处理自己的会话。尽管通过将 nginx 放在中间,您可以使用它来增强日志记录。不过我不是这方面的专家。
标签: java session tomcat cookies tomcat8