将csrf标记和parameterName添加到注销链接中

use*_*362 3 spring jsp spring-security

我在菜单中有链接:

<li><a href="<spring:url value="/logout" />">Logout</a></li>
Run Code Online (Sandbox Code Playgroud)

在我在spring-security xml设置中设置csrf保护之前,它工作得很好:

<http use-expressions="true">
    <csrf />
    <logout logout-url="/logout" logout-success-url="/success" />
</http>
Run Code Online (Sandbox Code Playgroud)

现在,我有问题,因为注销没有csrf,它不起作用.只返回找不到代码404的页面.如何将这些参数添加到我的注销链接中:

"${_csrf.parameterName}" value="${_csrf.token}"
Run Code Online (Sandbox Code Playgroud)

Bar*_*art 5

启用CSRF后,您只能使用POST请求注销.为此,您需要创建一个表单(或使用AJAX请求)来提交您的CSRF令牌.

<form action="/logout" method="post">
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
    <input type="submit" value="Logout" />
</form>
Run Code Online (Sandbox Code Playgroud)

或者你可以发送一个AJAX请求.

function changeHandler() {
    // request is done and issues a redirect
    if (this.readyState === 4 && this.status === 302) {
        location.refresh();
    }
}

var r = new XMLHttpRequest();
r.open('POST', '/logout', true);
r.onreadystatechange = changeHandler;
r.setRequestHeader('${_csrf.headerName}', '${_csrf.token}');
r.send();
Run Code Online (Sandbox Code Playgroud)