gpt4 book ai didi

java - ThreadLocal共享数据?

转载 作者:行者123 更新时间:2023-11-28 22:13:47 24 4
gpt4 key购买 nike

无论如何我知道以下是不可能的,但它正在我们的一个生产环境中发生:

设置

  • 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:问题中的代码已被简化,因为代码库对于示例来说太大了


error mail

最佳答案

阅读 ESAPI 代码 https://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/reference/DefaultHTTPUtilities.java关于线程本地有一些有问题的做法。

我要说的最大问题是它使用了 InheritableThreadLocal。如果线程 A 产生了一个线程 B,B 将继承 A 的线程本地值;但是,当 A 然后清除本地线程时,它不会影响 B,因此 B 的继承值将保留。 ESAPI 可能不应该使用 InheritableThreadLocal

在不了解您应用程序中线程的更多信息的情况下,我不能说这会如何产生您所看到的问题。

关于java - ThreadLocal共享数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14745403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com