【发布时间】:2023-03-31 15:21:01
【问题描述】:
我在会话超时后退出应用程序时遇到问题。我已经配置了注销网址:
<security:logout logout-url="/logout" logout-success-url="/" delete-cookies="JESSIONID"/>
我有注销表格:
<form action="#" th:action="@{/logout}" method="POST">
<input type="submit" th:value="#{btn.logout}"/>
</form>
表单标签添加了 csrf 参数,只要会话仍然处于活动状态,注销就可以正常工作。但是如果我登录应用程序,让它打开足够长的时间让会话过期,然后点击注销按钮,我会收到错误消息: HTTP 状态 405 - 不支持请求方法“POST”
我仍然希望保留 csrf 验证并使其作为 POST 请求工作。
【问题讨论】:
-
我不明白为什么你的注销表单有method="post"?
-
spring security 需要POST by default if csrf is enabled。如果您需要 GET 注销支持,请参阅 Rob 的答案:stackoverflow.com/a/20356111/2264997
-
我知道我可以禁用 csrf 并使其成为 GET,但如果可以的话,我仍然希望将其作为 POST 工作
-
很抱歉投票结束。我认为您无法在您的情况下避免 405 - 一旦会话到期,csrf 令牌也会到期。正如文档指出的那样,您必须添加某种类型的 js 以在会话超时之前提示用户。
标签: spring spring-mvc spring-security