如果失去与服务器的连接,使用Spring Security可以从控制器注销用户

时间:2018-10-19 14:40:08

标签: java spring

早上好

我是java和spring的新手,目前在我的一个应用程序中实现了Spring安全性,该应用程序使用logout-url = /logout配置以及logoutSuccessHandler来允许用户单击注销按钮以注销。我还在javascript中从客户端实现了心跳模式,该模式将使服务器知道该应用程序已在浏览器中打开。它每5分钟向服务器发布一条消息。如果浏览器已关闭,并且服务器未从浏览器收到消息,表明该服务器仍在运行,则我想强制从控制器调用注销URL。我该怎么办呢?我尝试使用HttpServletRequest实现HTTP请求,但这似乎不起作用。

3 个答案:

答案 0 :(得分:0)

您可能是从错误的角度接近这个问题。听起来您想将最大会话超时设置为默认值以外的其他值。假设您正在servlet容器上运行,则可以在web.xml guide中对其进行配置。

如果用户在超时期间未与您的服务器进行任何活动,则他们的会话将过期。

如果需要对会话破坏进行操作,则可以按照link

中的说明添加HttpSessionListener。

答案 1 :(得分:0)

您可以使用Scheduler,它会按特定间隔检查从浏览器更新的值。 您可以在本地注销服务。正如CollinD所提到的,您不需要Httprequest。 祝你好运。

答案 2 :(得分:0)

这是我过去创建的一项服务,用于在删除用​​户的访问权限时立即强制处理无效会话。

@Service
public class SecurityServiceImpl implements SecurityService {
    private SessionRegistry sessionRegistry;

    @Autowired
    public SecurityServiceImpl(SessionRegistry sessionRegistry) {
        Assert.notNull(sessionRegistry, "This implementation of SecurityService requires a SessionRegistry");
        this.sessionRegistry = sessionRegistry;
    }

    @Override
    public Integer expireUserSessions(User user) {
        int result = 0;
        Set<SessionInformation> sessionsToDestroy = new HashSet<>();
        sessionRegistry.getAllPrincipals().forEach(principal -> {
            if (principal instanceof UserDetails) {
                UserDetails current = (UserDetails) principal;
                if (current.getUsername().equals(user.getEmail())) {
                    sessionsToDestroy.addAll(sessionRegistry.getAllSessions(current, false));
                }
            }
        });
        for (SessionInformation session : sessionsToDestroy) {
            result++;
            session.expireNow();
        }

        return result;
    }
}

由于User是我的实体类之一,显然,用于选择会话的特定逻辑会有所不同。