首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpringSecurity:无法删除JSESSIONID

SpringSecurity:无法删除JSESSIONID
EN

Stack Overflow用户
提问于 2013-04-11 18:11:55
回答 5查看 29.4K关注 0票数 6

当用户注销时,我需要删除cookie JSESSIONID。为此,我将以下配置添加到我的安全配置中:

代码语言:javascript
复制
<http>
    <form-login login-page="/login*" authentication-failure-url="/login?try_again" />
    <http-basic />
    <logout logout-url="/logout" delete-cookies="JSESSIONID" />
    <session-management invalid-session-url="/timeout" />

    <intercept-url pattern="/login*"    access="IS_AUTHENTICATED_ANONYMOUSLY" />

    ...

</http>

但是cookie并没有被删除,而是被复制了:

因此,它会一直将浏览器重定向到"/timeout“网址。

我试图使用Chrome web浏览器中的开发人员工具来跟踪发生了什么,我发现这个cookie设置了这个响应头:

代码语言:javascript
复制
Set-Cookie:JSESSIONID=CFF85EA743724F23FDA0317A75CFAD44; Path=/website/; HttpOnly

并使用此响应头进行删除:

代码语言:javascript
复制
Set-Cookie:JSESSIONID=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/website

我不确定,但原因似乎是在这些头文件的"Path“字段中:在第一个文件中,它指向"/website/",在第二个文件中,它指向"/website”。

这是出现上述问题的原因吗?如果这不是原因(或不是唯一的原因),其他原因是什么?我该怎么解决这个问题呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-11 18:18:39

您不需要像这样显式删除JSESSIONID cookie。它不是由Spring Security本身管理的,而是由您的servlet容器管理的。Spring Security默认情况下会在注销时使http会话失效,这反过来会导致servlet容器删除JSESSIONID cookie。

票数 8
EN

Stack Overflow用户

发布于 2015-09-17 19:21:16

在我的例子中,由于某些原因,即使SecurityContextLogoutHandler调用了session.invalidate()JSESSIONID也不会被清除。它的价值保持不变。

我尝试以OP尝试的方式使用delete-cookies="JSESSIONID",我相信我也遇到了同样的问题:为cookie设置的路径是末尾没有/的上下文路径,因此它仍然不会被清除(它发出的命令是删除一个不存在的cookie )。

我最终编写了自己的cookie,除了为ProperCookieClearLogoutHandler设置上下文路径的那一行之外,它被标识为CookieClearingLogoutHandler

代码语言:javascript
复制
package com.testdomain.testpackage;

import java.util.Arrays;
import java.util.List;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutHandler;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

public final class ProperCookieClearingLogoutHandler implements LogoutHandler {
    private final List<String> cookiesToClear;

    public ProperCookieClearingLogoutHandler(String... cookiesToClear) {
        Assert.notNull(cookiesToClear, "List of cookies cannot be null");
        this.cookiesToClear = Arrays.asList(cookiesToClear);
    }

    public void logout(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) {
        for (String cookieName : cookiesToClear) {
            Cookie cookie = new Cookie(cookieName, null);
            String cookiePath = request.getContextPath() + "/";
            if (!StringUtils.hasLength(cookiePath)) {
                cookiePath = "/";
            }
            cookie.setPath(cookiePath);
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }
}

然后我在spring-security.xml上这样设置LogoutFilter的配置;

代码语言:javascript
复制
    <bean id="logoutFilter"
        class="org.springframework.security.web.authentication.logout.LogoutFilter">
        <constructor-arg name="logoutSuccessUrl" value="/views/login/login.xhtml?logout" />
        <constructor-arg>
            <list>
                <bean id="properCookieClearingLogoutHandler"
                    class="com.imatia.arpad.gplenos.authorization.ProperCookieClearingLogoutHandler">
                    <constructor-arg name="cookiesToClear">
                        <list>
                            <value>JSESSIONID</value>
                        </list>
                    </constructor-arg>
                </bean>
                <bean id="securityContextLogoutHandler"
                    class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler">
                </bean>
            </list>
        </constructor-arg>
        <property name="filterProcessesUrl" value="/logout" />
    </bean>
票数 5
EN

Stack Overflow用户

发布于 2013-04-13 14:09:21

下面是我使会话失效的方法:

代码语言:javascript
复制
<security:logout invalidate-session="true" logout-success-url="/myapp/auth/login" logout-url="/myapp/auth/logout" />
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15946132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档