我知道每个请求都是由servlet线程提供的,但是一个用户会话是可能的,两个不同的线程提供两个请求吗?
如果上面的情况真的发生了,那么第一个请求服务线程存储的线程局部变量会被第二个请求服务线程读取吗?
我担心如果我在第一个线程中将用户凭据存储在Spring Security的SecurityContextHolder(使用线程局部变量)中,则第二个线程将无法访问用户凭据...
答案 0 :(得分:1)
不,多个线程不会提供一个请求。真正发生的是一个线程提供2个请求。这就是你自己应该非常小心使用线程局部变量的原因。但是你可以信任Spring框架:它做得对。例如,它可以在使用本地线程时使用会话或请求ID,因此一个线程处理的2个请求不会混淆。
答案 1 :(得分:1)
我知道每个请求都是由servlet线程提供的,但是一个用户会话是可能的,两个不同的线程提供两个请求吗?
是的,这是可能的。
我担心如果我在第一个线程中将用户凭据存储在Spring Security的SecurityContextHolder(使用线程局部变量)中,则第二个线程将无法访问用户凭据...
Spring为每个请求单独建立安全性,您不必自己处理。
答案 2 :(得分:0)
同一用户的两个单独请求(最有可能)由两个不同的线程处理。
我不确定Spring做了什么,但是Servlet api提供了一种检索特定于用户会话的数据的方法(服务器如何跟踪会话是无关紧要的,但是看看cookie和url重写)。 / p>
现在,如果我想在threadlocal变量上拥有用户凭据(这并不罕见,因为ThreadLocal伪单例是我知道的最方便的注入方式),我会将它们存储在用户HttpSession上(在同一用户的所有请求中都是持久的)并使用servlet过滤器在每个请求开始时将它们放在threadlocal上。
我希望这会让事情变得更加清晰。我发现即使使用最新的框架,最好知道发生了什么事情:)