Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java web环境中的线程局部问题_Java_Multithreading_Servlets_Thread Local - Fatal编程技术网

Java web环境中的线程局部问题

Java web环境中的线程局部问题,java,multithreading,servlets,thread-local,Java,Multithreading,Servlets,Thread Local,我知道每个请求都由一个servlet线程提供服务,但是一个用户会话、两个请求由两个不同的线程提供服务是否可能 如果上述情况真的发生了,那么第一个请求服务线程存储的线程局部变量会被第二个请求服务线程读取吗 我担心,如果我将用户凭证存储在第一个线程中Spring Security的SecurityContextHolder(使用线程局部变量)中,第二个线程将无法访问用户凭证…否,一个请求将不会由多个线程提供服务。真正可能发生的是一个线程提供两个请求。这就是您自己使用线程局部变量时应该非常小心的原因。

我知道每个请求都由一个servlet线程提供服务,但是一个用户会话、两个请求由两个不同的线程提供服务是否可能

如果上述情况真的发生了,那么第一个请求服务线程存储的线程局部变量会被第二个请求服务线程读取吗


我担心,如果我将用户凭证存储在第一个线程中Spring Security的SecurityContextHolder(使用线程局部变量)中,第二个线程将无法访问用户凭证…

否,一个请求将不会由多个线程提供服务。真正可能发生的是一个线程提供两个请求。这就是您自己使用线程局部变量时应该非常小心的原因。不过,您可以相信Spring框架:它做得很好。例如,当使用本地线程时,它可以使用会话或请求ID,这样一个线程处理的两个请求就不会混淆

我知道每个请求都由一个servlet线程提供服务,但是一个用户会话、两个请求由两个不同的线程提供服务是否可能

是的,那是可能的

我担心,如果我将用户凭证存储在第一个线程中Spring Security的SecurityContextHolder(使用线程局部变量)中,第二个线程将无法访问用户凭证


Spring为每个请求分别建立安全性,您不必自己处理。

同一用户的两个单独请求(很可能)由两个不同的线程处理

我不确定Spring做了什么,但ServletAPI提供了一种检索特定于用户会话的数据的方法(服务器如何跟踪会话是不相关的,但请查看cookie和url重写)

现在,如果我想在threadlocal变量上拥有用户凭据(这并不罕见,因为threadlocal伪单例是我所知道的最方便的注入方式),我会将它们存储在users HttpSession上(这在同一用户的所有请求中都是持久的)并在每个请求开始时使用servlet过滤器将它们放在threadlocal上


我希望这能让你明白一点。我发现,即使使用最新的框架,也最好知道引擎盖下发生了什么:)

什么是“通过Spring为每个请求分别建立安全性”?我只能在Spring Security的源代码中看到ThreadLocal…是的,它使用ThreadLocal,但每个请求都由Spring Security单独设置。似乎SecurityContextPersistenceFilter起到了神奇的作用。谢谢