在UserDetailsS​​ervice中注入的HttpServletRequest是不是由过滤器添加了包装的HttpServletRequest?

时间:2018-04-23 18:22:54

标签: java spring spring-mvc spring-security servlet-filters

如何使用_my_custom_run来设置run自定义过滤器,以便我的自定义HttpServletRequestHttpServletRequestWrapperHttpServletRequest,这样它就会看到包裹的@Autowired而不是正常的UserDetailsService

让我试着解释一下:在我的自定义过滤器中,我分析子域和域,并将HttpServletRequest中的便捷信息包装在HttpServletRequest并覆盖HttpServletRequest

但是当我在HttpServletRequestWrapper中使用getHeader()注入HttpServletRequest时,注入的@Autowired不是已包含的{并且不包含我自定义添加的信息过滤

在我的UserDetailsService我已经将所有过滤器放在所有弹簧过滤器(HttpServletRequestweb.xmlContextLoaderListener)之前,所以我的过滤器应该是第一个内联过滤器。它确实让我怀疑。

请注意,当我在普通控制器中注入RequestContextListener时,它会注入包裹的DelegatingFilterProxyHttpServletRequest可能是一个特例。

任何人都有一个好主意?

1 个答案:

答案 0 :(得分:0)

似乎在UserDetailsS​​ervice中注入的HttpServletRequest与普通控制器不同。

在普通控制器中,request.getHeader调用会调用包装的request.getHeader。在UserDetailsS​​ervice中,似乎并非如此。我怀疑UserDetailsS​​ervice中的HttpServletRequest是一个副本,并没有围绕原始的HttpServletRequest进行包装/代理,可能需要序列化。

但幸运的是,可以使用request.setAttribute,在UserDetailsS​​ervice和普通控制器中注入的HttpServletRequest中可以使用请求属性。

请注意,上面有点hacky。根据您的使用案例,您可能希望阅读@M的有趣评论。 Deinum并使用自定义AuthenticationDetailsS​​ource生成的自定义WebAuthenticationDetails中的数据进行AuthenticationProvider路由。