Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在会话超时时删除自定义cookie_Java_Spring_Cookies_Spring Security_Session Timeout - Fatal编程技术网

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

Java 在会话超时时删除自定义cookie,java,spring,cookies,spring-security,session-timeout,Java,Spring,Cookies,Spring Security,Session Timeout,在我的应用程序中,在登录时,我正在创建一个cookie(AAA)。注销时,我可以删除cookie。在自动会话超时时,将用户重定向到登录页面,但无法删除(过期)cookie(AAA)。我在应用程序中使用JBossAS7.1、spring-3.1和spring安全性 以下是my security.xml中的http标记配置 <http auto-config="true" use-expressions="true" entry-point-ref="customLoginUrlAuthent

在我的应用程序中,在登录时,我正在创建一个cookie(AAA)。注销时,我可以删除cookie。在自动会话超时时,将用户重定向到登录页面,但无法删除(过期)cookie(AAA)。我在应用程序中使用JBossAS7.1、spring-3.1和spring安全性

以下是my 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似乎不起作用,因为我可以在会话超时后看到cookie。选项2的问题是,如果登录的用户尝试从同一浏览器中使用不同的选项卡再次请求登录页面,则会调用筛选器并删除cookie。这很糟糕。因为cookie是进一步通信所必需的

你能帮我删除cookie的正确方法吗


我还想提到在HttPSessionListene#sessionDestroyed方法之前调用过滤器

您必须在会话超时时删除cookies。
我们在项目中做了以下工作:

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

    在会话管理标记中设置URL

    <session-management session-authentication-strategy-ref="maxSessions"
        invalid-session-url="/home/sessionExpired"/>
    
    希望它能帮助你


  • 你的饼干是做什么用的?由于您使用的是spring安全性,我认为它不用于会话标识,因为它由spring sec管理。如果您有一个会话,为什么要尝试将另一个cookie与您的会话同步?您将在中找到有关cookie类型的参考,我们正在其他子系统中执行基于cookie的身份验证OK,但是您确定您真的需要在这两个系统上保持会话同步吗?我不确定您是否可以,但您也可以考虑将其作为在中心点对用户进行身份验证的一种实现,以利于多个系统。请注意,此协议使用会话cookie,而不是永久cookie(请参阅我之前的评论以获取参考)。没错。但此时此刻,我无法改变任何事情。如果你能用剩下的选项提供一些方向,你应该提供更多关于你想做什么和你能做什么的信息。如果没有更多信息,我只能问您是否在会话中保留cookie的值。它可以帮助查看cookie是否有效(不在当前会话中意味着无效…)在何处添加此
    handleSessionTimeout
    方法?您需要在控制器中添加此方法。
    @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";
    }