使用SpringSecurity处理超时



我们使用Spring Security来保护web应用程序的安全,我们希望记录登录/注销/超时事件。

请让我解释一下目前的实施情况:

  1. 处理注销:

我们使用java配置,登录/注销工作正常,我们用logoutSuccessHandler()捕获注销事件和会话详细信息,如username。但是,这仅在单击注销链接时有效,而在超时时无效。

在配置类中:

.and().formLogin().loginPage("/login").permitAll() 
       .and().logout().permitAll().logoutSuccessHandler(customLogoutSuccessHandler);

和处理程序定义:

@Component
public class LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException {
        if (authentication != null) {
            System.out.println("This user is closing the session: " + authentication.getName());
        }
        super.onLogoutSuccess(request, response, authentication);
    }
}

到目前为止,登录和注销都很好,当我们点击注销链接时,我们可以拦截事件并打印用户名。让我们看看超时配置。。。

  1. 处理超时

为了实现会话超时过期,我们在附加到Servlet上下文的侦听器中配置它:

public class SessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent event) {
        System.out.println("session created");
        event.getSession().setMaxInactiveInterval(15);
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
       System.out.println("session destroyed");
    }
}

然后在Initializer:中

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    super.onStartup(servletContext);
    servletContext.addListener(new SessionListener());
}

使用上面的代码,我们可以在sessionDestroyed()方法中拦截超时,但此时HttpSessionEvent与spring会话完全无关(例如,无法访问用户名)。

我确信我们缺少了一些将HttpSession与Spring联系起来的东西。在我看来,我们对会话过期的配置与Spring无关。

说到这里,我有一些问题:

  1. 有没有更好的方法来处理Spring的会话(例如会话超时),这样我们就不必在Servlet上下文中创建侦听器了
  2. 我们如何拦截超时并打印类似于"Authentication.getName()"的用户详细信息

欢迎任何建议或推荐讲座!

谢谢,祝你今天过得愉快!

以下是一些替代方法:

1) 使用jquery超时,你可以找到更多免费的插件用于你的网络。(例如:jquery空闲超时)

2) 有一次,我也为这个问题而挣扎,我一直在做的一个变通方法是使用沙盒iframe。显示页面中的所有详细信息,并在页面末尾放置具有注销用户链接的iframe。

这是一些建议。

以下是我在超时时获取用户名的方法:

@Override
public void sessionDestroyed(HttpSessionEvent event) {
    HttpSession httpSession = event.getSession();
    long lastAccessedTime = httpSession.getLastAccessedTime();
    int maxInactiveTime = httpSession.getMaxInactiveInterval() * 1000; //millis
    long currentTime = System.currentTimeMillis();
        if ((currentTime - lastAccessedTime) >= maxInactiveTime ){
        //if is a timeout
            SessionInformation i = sessionRegistry().getSessionInformation(event.getSession().getId());
            String username = ((User) i.getPrincipal()).getUsername();
        }
    }

在同一个文件中,我有

@Bean
public SessionRegistry sessionRegistry() {
    return new SessionRegistryImpl();
}

相关内容

  • 没有找到相关文章

最新更新