尽管在表单中发送CSRF令牌,但不支持Spring Security CSRF 405方法POST

时间:2017-09-15 04:48:13

标签: java spring spring-security csrf-protection http-status-code-405

我使用的是Spring框架版本4.3.5.RELEASE。 Spring安全版本是4.2.2.RELEASE。

我正面临一个与CSRF有关的奇怪问题。每当我提交表单(来自JSP文件)时,有时它工作正常,表单提交没有错误但有时在提交表单之后,它显示 Http状态405?方法不受支持。我也在csrf令牌中包含了隐藏字段,并将其作为查询字符串添加到表单的操作标记中。

以下是我项目中的POST表单示例:

 <form:form class="form-horizontal" method="POST" modelAttribute="dealerVisit" enctype="multipart/form-data" 
        action="http://localhost:8080/update/edit.html?${_csrf.parameterName}=${_csrf.token}">

        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}">
</form:form>

这是我提交上述表格的控制器:

@RequestMapping(value = "/update/edit.html", method = RequestMethod.POST)
    public String saveEdit(ModelMap map, @Valid @ModelAttribute(MODEL_KEY) DealerVisitVO dealerVisitVO, BindingResult result,
            @RequestParam(required = false, name="followup") Boolean followup) {
//my codes here
}

问题随机出现。有时会有效,有时则无效。代码或表单没有变化。禁用CSRF不是一种可能的解决方案,因为这是我的客户的一项要求。

如果有人能够解决,请帮助。

1 个答案:

答案 0 :(得分:1)

在春季安全性中,CSRF令牌是按会话生成的,并且保持不变,直到您的会话没有过期。这是您无法使用405方法的一种情况,因为您的会话每隔一段时间就会过期(您可以检查一下)。其次,如果您使用的是Spring形式,则无需将令牌显式地放置在隐藏字段中,Spring默认情况下会这样做,也无需将其放入查询字符串中。您的代码应该是这样的...

NULL