如何使用_my_custom_run
来设置run
自定义过滤器,以便我的自定义HttpServletRequest
中HttpServletRequestWrapper
为HttpServletRequest
,这样它就会看到包裹的@Autowired
而不是正常的UserDetailsService
?
让我试着解释一下:在我的自定义过滤器中,我分析子域和域,并将HttpServletRequest
中的便捷信息包装在HttpServletRequest
并覆盖HttpServletRequest
。
但是当我在HttpServletRequestWrapper
中使用getHeader()
注入HttpServletRequest
时,注入的@Autowired
不是已包含的{并且不包含我自定义添加的信息过滤
在我的UserDetailsService
我已经将所有过滤器放在所有弹簧过滤器(HttpServletRequest
,web.xml
和ContextLoaderListener
)之前,所以我的过滤器应该是第一个内联过滤器。它确实让我怀疑。
请注意,当我在普通控制器中注入RequestContextListener
时,它会注入包裹的DelegatingFilterProxy
。 HttpServletRequest
可能是一个特例。
任何人都有一个好主意?
答案 0 :(得分:0)
似乎在UserDetailsService中注入的HttpServletRequest与普通控制器不同。
在普通控制器中,request.getHeader调用会调用包装的request.getHeader。在UserDetailsService中,似乎并非如此。我怀疑UserDetailsService中的HttpServletRequest是一个副本,并没有围绕原始的HttpServletRequest进行包装/代理,可能需要序列化。
但幸运的是,可以使用request.setAttribute,在UserDetailsService和普通控制器中注入的HttpServletRequest中可以使用请求属性。
请注意,上面有点hacky。根据您的使用案例,您可能希望阅读@M的有趣评论。 Deinum并使用自定义AuthenticationDetailsSource生成的自定义WebAuthenticationDetails中的数据进行AuthenticationProvider路由。