我知道这可能不是这类问题的最佳设计,只是针对特定要求。
当前应用程序需要ServletContext
,HttpServletRequest
,HttpServletResponse
进入customized authentication provider
的服务层。
显然,代码后面没有任何特定的配置或继承:
@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
,但这需要网址格式,否则会拦截我认为可能是性能问题的所有网址?
在spring-security.xml或application-context.xml中创建一个request
范围bean,然后注入当前的身份验证提供程序类,使其能够获取HttpServletRequest
。但是我觉得这里有一些错误,比如如何启动请求范围bean?
那么什么是最好的做法?
答案 0 :(得分:2)
除了作为一个“坏主意”之外,请求对象仅与请求一样长。由于生命周期的不同,您无法将其注入单例。您可以通过方法参数传递它。
与您的请求匹配的最接近的解决方案是在catch all过滤器内创建一个ThreadLocal变量并将其设置在那里并将该过滤器或委托注入到您服务的本地线程中。我强烈建议你避免这种情况。
答案 1 :(得分:0)
您是否尝试在身份验证提供程序中实现HttpRequestHandler接口以及AuthenticationUserDetailsService?