我正在开发一个java spring mvc应用程序。我已经实现了UserDetailsService
接口,如下所示:
@Component
@Transactional
public class SecurityDAO implements UserDetailsService{
@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
...
}
....
}
我需要在loadUserByUsername
方法中找到用户登录URL(因为该项目有多个登录URL)。实际上,我想访问UserDetailsService
实施中的请求参数。
答案 0 :(得分:10)
只需在您的服务上注入请求:
@Autowired
private HttpServletRequest request;
要使它工作,你需要先注册RequestContextListener,但是:
@Bean
public RequestContextListener requestContextListener(){
return new RequestContextListener();
}
答案 1 :(得分:4)
所有信息均可通过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();
}
}
如果您不是春季启动,请记住将以下监听器添加到web.xml
:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
如果您使用的是弹簧靴,请在此处添加。
@Bean
public RequestContextListener requestContextListener(){
return new RequestContextListener();
}
更新:这是有效的,因为Spring注入了实现HttpServletRequest
的特殊范围代理,因此您可以从单例范围的MyDetailsService
访问请求范围的请求“bean”。在引擎盖下,每次调用request
的参数都会路由到org.springframework.web.context.request.RequestContextHolder#requestAttributesHolder
ThreadLocal
,您也可以直接访问该RequestContextHolder
HttpServletRequest request =
((ServletRequestAttributes) RequestContextHolder.
currentRequestAttributes()).
getRequest();
。正如您所看到的,Spring在确定范围规则时非常灵活。它只是有效。
BEGIN
FOR tname IN (select table_name from all_tab_columns where column_name = 'ID' and owner='PACC_USER') LOOP
EXECUTE IMMEDIATE
'select unique id from ' || tname;
END LOOP;
End;
另一种方法是使用RequestContextHolder
:
PLS-00306: wrong number or types of arguments in call to '||'
答案 2 :(得分:2)
简单方法: 1)注册RequestContextListener
@Bean
public RequestContextListener requestContextListener(){
return new RequestContextListener();
}
2)到主要课程:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.
currentRequestAttributes()).
getRequest();
3)之后我们可以在自定义标题中使用参数:
request.getHeader("OrganizationId")
答案 3 :(得分:0)
您可以使用
获取当前请求HttpServletRequest request =
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
.getRequest();
然后从那里访问请求参数。