gpt4 book ai didi

session - 如何关闭shiro session

转载 作者:行者123 更新时间:2023-12-02 13:51:36 29 4
gpt4 key购买 nike

当硬编码尝试使用 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: There is no session with id ,那么如何手动关闭 shiro session ?

最佳答案

您不应该尝试重新创建 session 然后操作它,您应该使用用户登录的线程通过安全管理器获取 session ,如下所示:

SecurityUtils.getSubject().logout();

如果您想从不同的线程调用注销,您可以使用 SessionDAO 接口(interface),但您需要进行额外的配置以使 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();
}
}

关于session - 如何关闭shiro session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22826922/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com