【发布时间】:2014-02-20 05:41:09
【问题描述】:
我在 Spring MVC Web 应用程序中实现了 Spring 安全性。 出于身份验证目的,我使用 LDAP 和授权,我调用第三方 Web 服务,该服务为我提供所有授权以及会话 ID。
一旦用户注销或会话超时,我需要使用相同的会话 ID 再次调用第三方 Web 服务以使会话失效。
我创建了一个像这样监听 SessionDestroyedEvent 的注销监听器
public class LogoutListener implements ApplicationListener<SessionDestroyedEvent>{
private SecurityServiceHandler securityServiceHandler;
@Override
public void onApplicationEvent(SessionDestroyedEvent event) {
SecurityContext securityContext = event.getSecurityContext();
UserDetails ud=null;
if(securityContext!=null){
ud = (UserDetails) securityContext.getAuthentication().getPrincipal();
if(securityServiceHandler==null){
securityServiceHandler = new SecurityServiceHandler();
}
//String sessionId = securityServiceHandler.getSessionId();
String sessionId = VirgoSessionManager.getSessionId();
System.out.println(ud.getUsername());
System.out.println(VirgoSessionManager.getSessionId());
securityServiceHandler.invalidateSession(ud.getUsername(),sessionId);
//reset the sessionId
securityServiceHandler.setSessionId(null);
}
}
我在 VirgoSessionManager 类中使用了 ThreadLocal,如下所示
public class VirgoSessionManager {
private static ThreadLocal<String> sessionId = new ThreadLocal<String>();
public static String getSessionId(){
return sessionId.get();
}
public static void setSessionId(String sId) {
sessionId.set(sId);
}
public static void remove() {
sessionId.remove();
}
}
我的问题是 VirgoSessionManager 在会话创建成功后没有返回我在第三方会话创建调用期间设置的会话,即使我已经实现了线程本地。
任何帮助将不胜感激。 谢谢!
【问题讨论】:
标签: spring session spring-mvc spring-security thread-local