将HttpServletResponse注入服务层的最佳方法

我知道这可能不是这样一个问题的最佳设计,只是针对特定要求。

当前应用程序需要ServletContextHttpServletRequestHttpServletResponse进入服务层以获得customized authentication provider

显然没有任何特定的配置或inheritance代码:

 @Component("myAuthenticaionProvider") public class MyAuthenticaionProvider implements AuthenticationUserDetailsService { @Autowired private ServletContext context; @Autowired private HttpServletRequest request; @Autowired private HttpServletResponse response; ....... } 

必须抛出exception:

 nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.servlet.http.HttpServletResponse] found for dependency: 

我能想到的可能解决方案:

  1. 使用filter拦截HttpServletRequest ,但是需要URL模式,否则将拦截我认为可能是性能问题的所有URL?

  2. 在spring-security.xml或application-context.xml中创建一个request范围bean,然后注入当前的身份validation提供程序类,使其能够获取HttpServletRequest 。 但是我觉得这里有什么问题,比如如何启动请求范围bean?

那么什么是最好的做法?

除了作为一个“坏主意”之外,请求对象仅与请求一样长。 由于生命周期的不同,您无法将其注入单例。 您可以通过方法参数传递它。

与您的请求匹配的最接近的解决方案是在catch allfilter内创建一个ThreadLocal变量并将其设置在那里并将该filter或委托注入到服务的本地线程中。 我强烈建议你避免这种情况。

您是否尝试在身份validation提供程序中实现HttpRequestHandler接口以及AuthenticationUserDetailsS​​ervice?