无论如何,我知道以下是不可能的,但它发生在我们的一个生产环境中:
设置
- ESAPI 2.01
主 servlet 过滤器设置和删除当前请求线程本地对象:
try { ESAPI.httpUtilities().setCurrentHTTP(request, response); // filter logic ... } catch (Exception e) { LOG.error(Logger.SECURITY_FAILURE, "Error in ESAPI " + "security filter: " + e.getMessage(), e); request.setAttribute("message", e.getMessage()); } finally { ESAPI.clearCurrent(); }
所有请求都通过此过滤器,并ESAPI.currentRequest()在整个系统中使用。
- 路径 A (
http://server/path_a/)- 一直到它到达
method_a,这个方法不能从path_b
- 一直到它到达
- 路径 B (
http://server/path_b)- 一直到它到达
method_b,无法从path_a
- 一直到它到达
这两条路径都经过 servlet 过滤器(映射“ /*”)
我收到的其中一封错误邮件表明path_a正在引发错误,这反过来又会启动错误邮件,在邮件代码中,当前请求(通过ESAPI.currentRequest())被枚举为请求信息。
问题
在错误邮件中,来自的请求信息与来自path_a的堆栈跟踪信息相关method_b,对我来说这似乎是不可能的,因为两者都在单独的线程中运行。
问题
这怎么可能?我无法在本地重新创建它,除了设置和清除之外,我还必须采取某些预防措施ThreadLocal吗?这可能是tomcat设置的问题吗?我迷路了。
PS:问题中的代码已被简化,因为例如代码库太大
