Spring Multipart/Form-data csrf 问题
Spring Multipart/Form-data csrf issue
我一直在使用 multipart/form-data
类型的表单进行 csrf 验证时遇到问题,因为它既不让我验证也不上传我的文件,在尝试执行调用时返回 403。
经过一些研究,我发现 "multipart/form-data"
表单在 csrf 上有问题,因此我不得不添加
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
我的 .xhtml 文件中每个表单的注释。
(也尝试了 action='' 的形式,变体)
但它一直返回我的 csrf 值为 null
经过更多研究,我尝试添加 SpringMultipartFilter
<filter>
<display-name>springMultipartFilter</display-name>
<filter-name>springMultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>springMultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
并且还在表示部分的应用程序上下文中声明了 filterMultipartResolver
bean:
<bean id="filterMultipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="-1" />
</bean>
然后,Chrome 让我验证我的用户,并让我按下上传按钮,返回 200(OK)代码
但是,文件没有上传,调试显示我的方法没有被调用,控制台既没有返回错误 Java 也没有返回错误 Chrome 调试控制台,所以我有点失去了解决或解决的任何帮助如果能真正了解正在发生的事情,我们将不胜感激,谢谢。
我正在使用 Spring+Primefaces+Maven。
上传 .xhtml 格式的表单:
<h:form id="uploadForm" enctype="multipart/form-data">
<input type="hidden" name="${_csrf.parameterName}"
value="${_csrf.token}" />
<p:fieldset id="uploadBlock"
legend="#{message['cmb.title1.text.label']}">
<br />
<h:panelGroup layout="block"
style="float : left; margin-right : 10%;">
<h:panelGrid id="display1">
<p:fileUpload update=":tableForm:comparisonTable @this"
fileUploadListener="#{ComparisonCSVController.upload}"
allowTypes="/(\.|\/)(csv)$/i" mode="advanced" fileLimit="1"
description="Select a csv file">
</p:fileUpload>
</h:panelGrid>
</h:panelGroup>
</p:fieldset>
<br />
</h:form>
我确定我的 bean 或我的 beans 的实际方法没有问题,因为在我启用 spring 安全性之前一切正常,如果我将其关闭,一切运行顺利,但我需要它启用了,所以我正面临这个问题。
在弄乱 web.xml 中过滤器的顺序后已修复。
顺序必须是:
- Primefaces 过滤器-(我确实编辑了一个 FORWARD 标签)
- 多部分过滤器 -
- Spring 过滤器 -
- Prettyfaces 过滤器,带有 ASYNC 标签 -
谢谢。
我一直在使用 multipart/form-data
类型的表单进行 csrf 验证时遇到问题,因为它既不让我验证也不上传我的文件,在尝试执行调用时返回 403。
经过一些研究,我发现 "multipart/form-data"
表单在 csrf 上有问题,因此我不得不添加
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
我的 .xhtml 文件中每个表单的注释。
(也尝试了 action='' 的形式,变体)
但它一直返回我的 csrf 值为 null
经过更多研究,我尝试添加 SpringMultipartFilter
<filter>
<display-name>springMultipartFilter</display-name>
<filter-name>springMultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>springMultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
并且还在表示部分的应用程序上下文中声明了 filterMultipartResolver
bean:
<bean id="filterMultipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="-1" />
</bean>
然后,Chrome 让我验证我的用户,并让我按下上传按钮,返回 200(OK)代码 但是,文件没有上传,调试显示我的方法没有被调用,控制台既没有返回错误 Java 也没有返回错误 Chrome 调试控制台,所以我有点失去了解决或解决的任何帮助如果能真正了解正在发生的事情,我们将不胜感激,谢谢。
我正在使用 Spring+Primefaces+Maven。
上传 .xhtml 格式的表单:
<h:form id="uploadForm" enctype="multipart/form-data">
<input type="hidden" name="${_csrf.parameterName}"
value="${_csrf.token}" />
<p:fieldset id="uploadBlock"
legend="#{message['cmb.title1.text.label']}">
<br />
<h:panelGroup layout="block"
style="float : left; margin-right : 10%;">
<h:panelGrid id="display1">
<p:fileUpload update=":tableForm:comparisonTable @this"
fileUploadListener="#{ComparisonCSVController.upload}"
allowTypes="/(\.|\/)(csv)$/i" mode="advanced" fileLimit="1"
description="Select a csv file">
</p:fileUpload>
</h:panelGrid>
</h:panelGroup>
</p:fieldset>
<br />
</h:form>
我确定我的 bean 或我的 beans 的实际方法没有问题,因为在我启用 spring 安全性之前一切正常,如果我将其关闭,一切运行顺利,但我需要它启用了,所以我正面临这个问题。
在弄乱 web.xml 中过滤器的顺序后已修复。 顺序必须是: - Primefaces 过滤器-(我确实编辑了一个 FORWARD 标签) - 多部分过滤器 - - Spring 过滤器 - - Prettyfaces 过滤器,带有 ASYNC 标签 -
谢谢。