在spring security

时间:2016-07-05 07:27:13

标签: spring spring-security

在春季安全: 我想用两种方式注销:当发生会话超时或用户注销时......
无论如何,以HttpSessionEventPublisherSessionRegistry从sessionIds列表中删除SessionInformation来调用destroySession ...

当我使用以下方法强制注销特定用户时,此方法仅仅已过期" SessionInformation中的SessionRegistry。现在,当我得到所有在线用户" getAllPrincipals()"来自SessionRegistry的会话已过期的用户位于列表中!

@Override
public  boolean forceLogOut(int userId){
    for (Object username: sessionRegistry.getAllPrincipals()) {
        User temp = (User) username;
        if(temp.getId().equals(userId)){
            for (SessionInformation session : sessionRegistry.getAllSessions(username, false)) {
                session.expireNow();
            }
        }
    }
    return true;
}

如何退出特定用户'或者' sessionId'该会话对象从" Web服务器"和#34;会话注册表" ?
我在google搜索并在Servlet API中找到HttpSessionContext,可以从特定的sessionId获取HttpSession。然后使会话无效。但我认为这种方法并不完全有用!
(注意:这个类已被弃用!)

最好的方法是什么?我是不是错了?

1 个答案:

答案 0 :(得分:0)

试试这样:

@RequestMapping(value="/logout", method = RequestMethod.GET)
    public String logoutPage (HttpServletRequest request, HttpServletResponse response){
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null){    
            //new SecurityContextLogoutHandler().logout(request, response, auth);
            persistentTokenBasedRememberMeServices.logout(request, response, auth);
            SecurityContextHolder.getContext().setAuthentication(null);
        }
        return "redirect:/login?logout";
    }

要注销特定会话ID,请检查该链接: how to log a user out programmatically using spring security