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

Java 将HttpServletResponse注入服务层的最佳方法,java,spring,spring-mvc,Java,Spring,Spring Mvc,我知道,对于这样的问题,这可能不是一个最好的设计,而只是针对特定的需求 当前应用程序需要ServletContext,HttpServletRequest,HttpServletResponse进入服务层,以提供自定义身份验证提供程序 显然,没有任何特定的配置或继承,以下代码: @Component("myAuthenticaionProvider") public class MyAuthenticaionProvider implements AuthenticationUserDetail

我知道,对于这样的问题,这可能不是一个最好的设计,而只是针对特定的需求

当前应用程序需要
ServletContext
HttpServletRequest
HttpServletResponse
进入服务层,以提供
自定义身份验证提供程序

显然,没有任何特定的配置或继承,以下代码:

@Component("myAuthenticaionProvider")
public class MyAuthenticaionProvider implements AuthenticationUserDetailsService {
    @Autowired private ServletContext context;
    @Autowired private HttpServletRequest request;
    @Autowired private HttpServletResponse response;
        .......
}
必须引发异常:

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No matching bean of type [javax.servlet.http.HttpServletResponse] found for dependency:
我能想到的可能解决方案:

  • 截取
    HttpServletRequest
    ,使用过滤器,但这需要URL模式,否则将截取所有URL,我认为这可能是性能问题

  • 在spring-security.xml或application-context.xml中创建一个
    request
    scope bean,然后注入到当前的身份验证提供程序类中,使其能够获取
    HttpServletRequest
    。但是我认为这里有一些问题,比如如何启动请求范围bean

  • 那么最好的做法是什么呢?

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


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

    您是否尝试在身份验证提供程序中与AuthenticationUserDetailsService一起实现HttpRequestHandler接口?

    您到底想实现什么?这是一个坏主意,但在适当的环境中它会起作用<代码>((ServletWebRequest)RequestContextHolder.getRequestAttributes()).getResponse()。通过适当的环境,我指的是
    getRequestAttributes()
    返回的
    RequestAttributes
    属于
    ServletWebRequest
    类型的环境。如果您描述了您想要实现的目标,那么获得一个好的解决方案的机会会大得多。在我看来,您需要一个过滤器(特别是因为响应对象),但您不需要。所以我真的很想知道谁调用了这个服务,何时调用(以及为什么调用)。有趣的是,我发现
    HttpServletRequest
    能够自动连接到服务层。但不确定它是如何启动的。谢谢你的建议。谢谢。所以使用拦截器是目前为止最好的选择?我不知道,但是你需要在需要http servlet的自定义authprovider中实现什么?