在会话超时时删除自定义cookie

时间:2014-05-05 15:14:14

标签: java spring cookies spring-security session-timeout

在我的应用程序中,登录时我正在创建一个cookie(AAA)。在注销时,我可以删除cookie。在自动会话超时将用户重定向到登录页面但不能删除(过期)cookie(AAA)。我在我的应用程序中使用Jboss AS 7.1,spring-3.1和spring-security。

以下是我的security.xml中的http标签配置

<http auto-config="true" use-expressions="true" entry-point-ref="customLoginUrlAuthenticationEntryPoint" disable-url-rewriting="true">
    <request-cache ref="httpSessionRequestCache"/>
    <session-management invalid-session-url="/ctx/login?invalid-session=true" session-authentication-error-url="/ctx/login?session-auth-error=true">
        <concurrency-control max-sessions="1"  expired-url="/ctx/login?expired=true" error-if-maximum-exceeded="true" />
    </session-management>

    <form-login authentication-success-handler-ref="customAuthenticationSuccessHandler"
                authentication-failure-handler-ref="customPageHandler"
                login-processing-url="/j_spring_security_check"/>

    <custom-filter before="ANONYMOUS_FILTER" ref="anonymousFilter"/>
    <custom-filter before="FORM_LOGIN_FILTER" ref="customFilter"/>
    <custom-filter before="LOGOUT_FILTER" ref="logoutFilter" />
</http>

我尝试过以下选项

选项1 - 创建了一个HttpFilter来刷新cookie并同步会话和cookie之间的时间。

选项2 - 为登录页面url(/ login)创建了一个HttpFilter,为登录页面调用了Filter并删除了cookie。

选项1 似乎无法正常工作,因为我可以在会话达到timedout后看到cookie。而选项2 的问题是,如果记录的用户尝试从具有不同选项卡的同一浏览器再次请求登录页面,则会调用过滤器并删除co​​okie。这很糟糕。因为进一步沟通需要cookie。

你能帮我找一下删除cookie的正确方法吗?

另外我想提一下在HttPSessionListene#sessionDestroyed方法之前调用过滤器。

1 个答案:

答案 0 :(得分:1)

您必须在会话超时时删除Cookie 我们在项目中完成了以下工作:

  1. 您正在登录网址上传递一些参数&amp;根据参数值,您可能会删除cookie。我们使用不同的URL进行登录(/ auth / login)&amp;会话超时(/ home / sessionExpired)。

    在会话管理标记中设置网址

    <session-management session-authentication-strategy-ref="maxSessions"
        invalid-session-url="/home/sessionExpired"/>
    
  2. 在Controller中,

    @RequestMapping(value="/home/sessionExpired")
    public String handleSessionTimeout(HttpServletRequest request, RedirectAttributes    
        redirectAttributes) {
        SecurityContextHolder.clearContext();
        HttpSession = request.getSession(false);
        if(session != null) {
            session.invalidate();
        }
        for(Cookie cookie : request.getCookies()) {
            cookie.setMaxAge(0);
        }
        //err.sessionexpired : make entry in properties file
        redirectAttributes.addFlashAttribute("message", "err.sessionexpired");
        return "redirect:/auth/login";
    }
    

    希望它会对你有所帮助。