如何放置我的自定义过滤器,它使用HttpServletRequestWrapper
包装HttpServletRequest
,以便@Autowired
在我的自定义UserDetailsService
中HttpServletRequest
,以便它看到包装的HttpServletRequest
而不是普通HttpServletRequest
?
让我尝试解释一下:在我的自定义过滤器中,我分析了子域和域,并通过用HttpServletRequestWrapper
包装并覆盖getHeader()
将方便的信息放入HttpServletRequest
中。
但是当我使用@Autowired
in 注入HttpServletRequest
时,UserDetailsService
注入的HttpServletRequest
不是包装的,并且不包含我的自定义过滤器添加的信息。
在我的web.xml
中,我将过滤器放在所有弹簧过滤器(ContextLoaderListener
,RequestContextListener
和DelegatingFilterProxy
)之前,所以我的过滤器应该是第一个内联的。这确实让我感到疑惑。
请注意,当我在普通控制器中注入HttpServletRequest
时,它会注入包装的HttpServletRequest
。UserDetailsService
可能是一个特例。
有人有好主意吗?
似乎在UserDetailsService中注入的HttpServletRequest与普通控制器不同。
在普通控制器中,request.getHeader 调用会导致对包装的 request.getHead 的调用。在UserDetailsService中,情况似乎并非如此。我怀疑UserDetailsService中的HttpServletRequest是一个副本,并且没有包装/代理原始HttpServletRequest,也许它需要序列化。
但幸运的是可以使用request.setAttribute,请求属性在UserDetailsService和普通控制器中注入的HttpServletRequest中可用。
请注意,上面有点笨拙。根据您的用例,您可能需要阅读 @M. Deinum 的有趣评论,并使用由自定义 AuthenticationDetailsSource 生成的自定义 WebAuthenticationDetails 中的数据进行 AuthenticationProvider 路由。