アプリケーションのログアウトをj_spring_security_logoutでセットアップしようとしていますが、何らかの理由で機能しないため、404エラーが発生し続けます。
私はこのような関数を呼び出しています:
<a href="<c:url value="/j_spring_security_logout"/>"><img border="0" id="logout" src="./img/logout.png" /></a>
WebContent/jsp /アプリケーションのメインページにあり、ログインページとログアウトページはWebContent/login /にあります。
私はこの他の投稿もチェックしました Springセキュリティのログアウトの問題 ですが、そこに与えられた解決策は機能しません。
ここに私のweb.xmlが表示されます
<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>/*</url-pattern>
</filter-mapping>
そしてここに私の春のセキュリティ.xml
<http auto-config="true">
<intercept-url pattern="/*" access="ROLE_USER" />
<form-login login-page="/login/login.jsp"
authentication-failure-url="/login/errorLogin.jsp"/>
<logout logout-success-url="/" logout-url="/login/logout.jsp" />
</http>
<beans:bean id="myAuthenticationProvider"
class="myapp.web.authentication.WSAuthenticationProvider">
</beans:bean>
<authentication-manager>
<authentication-provider ref="myAuthenticationProvider"/>
</authentication-manager>
前もって感謝します。
logout-urlは仮想URLを参照します。その名前のリソースは必要ありません。次のいずれかを実行できます。
<logout logout-success-url="/" logout-url="/j_spring_security_logout" />
このようなあなたのページ上のリンク
<c:url value="/j_spring_security_logout" var="logoutUrl" />
<a href="${logoutUrl}">Log Out</a>
またはこれ:
<logout logout-success-url="/" logout-url="/logout" />
そして次のようにリンク:
<c:url value="/logout" var="logoutUrl" />
<a href="${logoutUrl}">Log Out</a>
両方が混ざっていたため、404エラーが発生しました。
csrfが有効になっているかどうかを確認します。 csrfが有効になっている場合、ログアウトにpostメソッドを使用する必要があります。非表示フィールドとしてcsrfトークンを追加します。次に、JavaScriptを使用してフォームを投稿し、ログアウトします
Spring Security 4の場合、ログアウトはフォームボタンから実行する必要があります。 CSRFトークンを一緒に送信する必要があります。 j_spring_security_logoutは機能しなくなりました。一日を過ごした後、私は仕事をしていることを知りました。
ステップ1: JSPページ
<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}" method="post">
<input type="submit" value="Logout"/>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
ステップ2
<security:http use-expressions="true">
<security:form-login login-page="/login" authentication-failure-url="/login?error=true" />
<security:logout logout-success-url="/login" invalidate-session="true" logout-url="/logout" />
</security:http>
ステップログインコントローラー
//Logout mapping
@RequestMapping("/logout")
public String showLoggedout(){
return "logout";
}
ステップ4 logout.jspが1つ必要です
ログアウト後にログインページに移動することを確認することが重要です。
<security:form-login login-page="/login" authentication-failure-url="/login?error=true" />
そのため、このログインページは、login.jspまたはコントローラーでマップするものに対応するマッピングを行う必要があります。
最初にsecurity-context.xmlを次のコードに設定します...
<security:logout logout-success-url="/"
invalidate-session="true" />
次に、このコードをjspファイルに追加します。
<script>
function formSubmit() {
document.getElementById("logoutForm").submit();
}
</script>
<c:url var="logoutUrl" value="/logout" />
<a href="javascript:formSubmit()"> Logout</a>
</li>
<form action="${logoutUrl}" method="post" id="logoutForm">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
JavaベースのSpring MVC構成では、セキュリティ構成クラスで構成する必要があります。
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.servletApi().rolePrefix("");
http
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
}
この回答は2倍になり、私の場合に取り組んでいます: Spring Security Java Config not logout url
また、コントローラは次のようになります
@RequestMapping("/logout")
public String logoutUrl(){
return "logout";
}