当硬编码尝试使用shiro注销时遇到错误。 用户不通过Web登录/注销URL登录和注销,而是通过后端链接。
登录时,它可以正常工作。
Subject currentUser = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(request.getParameter("username"), request.getParameter("password"));
token.setRememberMe(true);
try {
currentUser.login(token);
} catch (AuthenticationException e) {
e.printStackTrace();
}
但是当我尝试注销时出错:
public void userLogout(String sessionId){
SecurityManager securityManager = SecurityUtils.getSecurityManager();
Subject.Builder builder = new Subject.Builder(securityManager);
builder.sessionId(sessionId);
Subject subject = builder.buildSubject();
if (null != subject) {
try {
subject.logout();
} catch (SessionException e) {
// TODO: handle exception
}
}
}
但遇到错误[org.apache.shiro.session.UnknownSessionException:没有带id的会话,那么如何手动收集shiro会话?
答案 0 :(得分:6)
您不应该尝试重新创建会话然后进行操作,您应该使用用户登录的线程通过安全管理器获取会话,如下所示:
SecurityUtils.getSubject().logout();
如果你想以某种方式从另一个线程调用logout,你可以使用SessionDAO接口,但你需要做额外的配置让shiro使用SessionDAO,如下所述:
http://shiro.apache.org/session-management.html#SessionManagement-SessionStorage
正确配置后,您可以执行以下操作:
DefaultSecurityManager securityManager = (DefaultSecurityManager) SecurityUtils.getSecurityManager();
DefaultSessionManager sessionManager = (DefaultSessionManager) securityManager.getSessionManager();
Collection<Session> activeSessions = sessionManager.getSessionDAO().getActiveSessions();
for (Session session: activeSessions){
if (sessionId.equals(session.getId()){
session.stop();
}
}