无论如何,我知道以下是不可能的,但它发生在我们的一个生产环境中:
设置
- 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:问题中的代码已被简化,因为例如代码库太大