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,我认为这可能是性能问题request
scope bean,然后注入到当前的身份验证提供程序类中,使其能够获取HttpServletRequest
。但是我认为这里有一些问题,比如如何启动请求范围bean与您的请求相匹配的最接近的解决方案是在catch-all筛选器中创建一个ThreadLocal变量,并将其设置在那里,然后将该筛选器或线程本地的委托注入到您的服务中。我强烈建议您避免这种情况。您是否尝试在身份验证提供程序中与AuthenticationUserDetailsService一起实现HttpRequestHandler接口?您到底想实现什么?这是一个坏主意,但在适当的环境中它会起作用<代码>((ServletWebRequest)RequestContextHolder.getRequestAttributes()).getResponse()代码>。通过适当的环境,我指的是
getRequestAttributes()
返回的RequestAttributes
属于ServletWebRequest
类型的环境。如果您描述了您想要实现的目标,那么获得一个好的解决方案的机会会大得多。在我看来,您需要一个过滤器(特别是因为响应对象),但您不需要。所以我真的很想知道谁调用了这个服务,何时调用(以及为什么调用)。有趣的是,我发现HttpServletRequest
能够自动连接到服务层。但不确定它是如何启动的。谢谢你的建议。谢谢。所以使用拦截器是目前为止最好的选择?我不知道,但是你需要在需要http servlet的自定义authprovider中实现什么?