Spring安全注销问题

Jar*_*rek 9 spring-security

我在Spring框架中登出时遇到了问题.

首先,当我希望j_spring_security_logout为我处理它时,我得到404找不到j_spring_security_logout:sample-security.xml:

<http>
    <intercept-url pattern="/messageList.htm*" access="ROLE_USER,ROLE_GUEST" />
    <intercept-url pattern="/messagePost.htm*" access="ROLE_USER" />
    <intercept-url pattern="/messageDelete.htm*" access="ROLE_ADMIN" />
    <form-login login-page="/login.jsp" default-target-url="/messageList.htm"
        authentication-failure-url="/login.jsp?error=true" />
    <logout/>
</http>
Run Code Online (Sandbox Code Playgroud)

示例url链接到JSP页面中的注销:

<a href="<c:url value="/j_spring_security_logout" />">Logout</a>
Run Code Online (Sandbox Code Playgroud)

当我尝试使用自定义JSP页面,即我使用登录表单为此目的,然后我得到更好的结果,至少它到达登录页面,但另一个问题是,你不能被注销,因为你可以直接键入url应该保持警惕,无论如何都要过去.

从以前的列表略有修改:

<http>
    <intercept-url pattern="/messageList.htm*" access="ROLE_USER,ROLE_GUEST" />
    <intercept-url pattern="/messagePost.htm*" access="ROLE_USER" />
    <intercept-url pattern="/messageDelete.htm*" access="ROLE_ADMIN" />
    <form-login login-page="/login.jsp" default-target-url="/messageList.htm"
        authentication-failure-url="/login.jsp?error=true" />
    <logout logout-success-url="/login.jsp" />
</http>
Run Code Online (Sandbox Code Playgroud)
<a href="<c:url value="/login.jsp" />">Logout</a>
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

小智 12

我刚遇到这个问题.

您需要确保web.xml安全过滤器匹配url/j_spring_security_logout

例如

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/j_spring_security_logout</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)


小智 7

你应该做POST请求.像这样的东西:

<form action="${logoutUrl}" method="post" id="logoutForm">
            <input type="hidden" 
                    name="${_csrf.parameterName}"
                    value="${_csrf.token}" />
</form>

<script>
    function formSubmit() {
                document.getElementById("logoutForm").submit();
    }
</script>

<c:if test="${pageContext.request.userPrincipal.name != null}">
           <h2>
                Welcome : ${pageContext.request.userPrincipal.name} | 
                 <a href="javascript:formSubmit()"> Logout</a>
            </h2>
</c:if>
Run Code Online (Sandbox Code Playgroud)


Pau*_*oso 5

我遇到了同样的问题,在失去希望后,我终于找到了答案.当然,我们通过阅读和使用别人的代码,并通过这样做,我们继承的设置,我们不知道太多关于学到很多东西.

这就是使用Spring Security进行编程时发生的事情.

在Spring Security XML中,http标签中有以下行:

<logout invalidate-session="true" logout-success-url="/login" logout-url="/logout" />
Run Code Online (Sandbox Code Playgroud)

我在研究期间从一些教程或示例中得到了这一行.在使用j_spring_security_logout关键字2天后,除了错误404之外什么都没得到,我想出了这个.

在我正在使用的注销标记中,将此logout-url参数设置为"/ logout".然后我意识到根据我的设置,我的spring期待接收/注销而不是/ j_spring_security_logout.

一旦我相应地更新了我的代码,它就像一个魅力.