【发布时间】:2016-05-30 15:29:34
【问题描述】:
我在使用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 或我的 bean 的实际方法没有问题,因为在我启用 Spring Security 之前一切正常,如果我将其关闭,一切运行顺利,但我需要启用它,所以我面临这个问题。
【问题讨论】:
标签: spring maven primefaces spring-security multipartform-data