Spring安全注销问题

时间:2010-06-18 09:50:03

标签: spring-security

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

首先,当我希望j_spring_security_logout为我处理它时,我得到404 j_spring_security_logout未找到: 样品的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>

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

<a href="<c:url value="/j_spring_security_logout" />">Logout</a>

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

从以前的列表略微修改:

<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>
<a href="<c:url value="/login.jsp" />">Logout</a>

感谢您的帮助

6 个答案:

答案 0 :(得分:12)

我刚遇到这个问题。

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

e.g。

<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>

答案 1 :(得分: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>

答案 2 :(得分:5)

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

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

在Spring Security XML中,在 http 标记内,有以下一行:

<logout invalidate-session="true" logout-success-url="/login" logout-url="/logout" />

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

在我使用的注销标记中,将 logout-url 参数设置为“/ logout”。然后我意识到根据我的设置,我的春天期待收到 / logout 而不是 / j_spring_security_logout

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

答案 3 :(得分:2)

注销链接是否了解上下文路径?

例如,如果您的上下文路径是“myapp”,上面提到的链接点在哪里?

“http:// localhost:8080 / myapp / j_spring_security_logout”或“http:// localhost:8080 / j_spring_security_logout”?

实际上,j_spring_security_logout仅在webapp的上下文中有效,因此只有第一个链接才会生成正确的URL

答案 4 :(得分:1)

在您的页面中尝试此链接,其中包含注销链接:

<h:outputLink value="#{request.contextPath}/logout.jsp">Logout</h:outputLink>

并使用以下代码爬行“webcontent”文件夹中的logout.jsp文件:

<% response.sendRedirect("/#{request.contextPath}/j_spring_security_logout"); %>

如果发生错误,请尝试将“#{request.contextPath}”更改为项目名称 例如:我的项目名称是“security”,所以我在我的logout.jsp文件中使用:

<% response.sendRedirect("/security/j_spring_security_logout"); %>

答案 5 :(得分:1)

我遇到了同样的问题。

似乎是3.0.6的错误!

  

我只是降级到3.0.5,一切都很顺利。