所有信息都可以通过HttpServletRequest 获得。您可以通过以下方式获得它:
依赖注入
最简单的方法是将 servlet 请求直接注入您的 UserDetailsService: 类:
public MyDetailsService implements UserDetailsService {
@Autowired
private HttpServletRequest request;
//...
}
或
public MyDetailsService implements UserDetailsService {
@Autowired
private HttpServletRequest request;
public UserDetails loadUserByUsername(String username){
HttpServletRequest request =
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
.getRequest();
}
}
如果您不是 Spring Boot,请记住将以下侦听器添加到您的 web.xml:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
如果你使用的是spring boot,请在下面添加。
@Bean
public RequestContextListener requestContextListener(){
return new RequestContextListener();
}
更新:这是因为 Spring 注入了实现HttpServletRequest 的特殊作用域代理,因此您可以从单例作用域MyDetailsService 访问请求作用域的请求“bean”。在后台,每次调用request 的参数都会被路由到org.springframework.web.context.request.RequestContextHolder#requestAttributesHolder ThreadLocal,您也可以直接访问它。如您所见,Spring 在范围规则方面非常灵活。它只是工作。
RequestContextHolder
另一种方法是使用RequestContextHolder:
HttpServletRequest request =
((ServletRequestAttributes) RequestContextHolder.
currentRequestAttributes()).
getRequest();
延伸阅读: