Spring 安全性 AbstractAuthenticationProcessingFilter 扩展丢失实例变量值
Spring Security AbstractAuthenticationProcessingFilter Extension Losing Instance Variable Value
再一次,我希望我在这里做了一些非常愚蠢的事情。 :)
我在 Spring 安全实现中有 AbstractAuthenticationProcessingFilter
的扩展,在该扩展中,在 attemptAuthentication
方法中,我访问 passed-in HttpServletRequest
object 并取出一个 header 值,我将其存储在实例变量中。
我注意到,有时在调用我的项目中的另一个自定义方法期间,该实例变量的值被 null
输出。但是,它并不一致。
我在自定义方法中看不到任何负责覆盖变量的代码,因此,我正在尝试缩小范围。我希望这不是我忽略的线程安全之类的东西,也不是某种竞争条件。
有没有人遇到过这样的事情?
我正在使用 Spring 4.1.1 和 Spring 安全 3.2.5.
在此先感谢您的帮助。
容器只会创建过滤器的单个实例,因此拥有任何可变实例变量都不是线程安全的。任何并发请求都可能导致实例变量的状态不一致。你应该看看 HttpSession.
回复评论:
并不是必须使用 HttpSession,只是不要在 servlet/filter 中使用实例变量,因为它们不是线程安全的。如果您需要维护状态,并且不想使用会话,那么 AFAIK,您需要在每个请求中传递客户端信息。
再一次,我希望我在这里做了一些非常愚蠢的事情。 :)
我在 Spring 安全实现中有 AbstractAuthenticationProcessingFilter
的扩展,在该扩展中,在 attemptAuthentication
方法中,我访问 passed-in HttpServletRequest
object 并取出一个 header 值,我将其存储在实例变量中。
我注意到,有时在调用我的项目中的另一个自定义方法期间,该实例变量的值被 null
输出。但是,它并不一致。
我在自定义方法中看不到任何负责覆盖变量的代码,因此,我正在尝试缩小范围。我希望这不是我忽略的线程安全之类的东西,也不是某种竞争条件。
有没有人遇到过这样的事情?
我正在使用 Spring 4.1.1 和 Spring 安全 3.2.5.
在此先感谢您的帮助。
容器只会创建过滤器的单个实例,因此拥有任何可变实例变量都不是线程安全的。任何并发请求都可能导致实例变量的状态不一致。你应该看看 HttpSession.
回复评论:
并不是必须使用 HttpSession,只是不要在 servlet/filter 中使用实例变量,因为它们不是线程安全的。如果您需要维护状态,并且不想使用会话,那么 AFAIK,您需要在每个请求中传递客户端信息。