首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有enctype=“多部分/表单-数据”的

具有enctype=“多部分/表单-数据”的
EN

Stack Overflow用户
提问于 2015-01-06 13:46:29
回答 1查看 7.4K关注 0票数 1

我在jsp文件中有这样的表格:

代码语言:javascript
复制
<form:form method="POST" commandName="advertForm" onsubmit="return checkAddress();" enctype="multipart/form-data">

<form:errors path="*" cssClass="errorblock" element="div"/>

<table>
    <tr>
        <td>Text:</td>
        <td><form:input path="advert.text"/></td>
        <td><form:errors path="advert.text" cssClass="error"/></td>
    </tr>
    <table id="fileTable">
        <tr>
            <td><input name="images[0]" type="file" /></td>
        </tr>
        <tr>
            <td><input name="images[1]" type="file" /></td>
        </tr>
    </table>
    <tr>
        <td colspan="1"><a style="text-decoration: none" href="/"><input type="button" value="Cancel"/></a></td>
        <td colspan="2"><input type="submit" value="Save"/></td>
    </tr>
      <input type="hidden"
             name="${_csrf.parameterName}"
             value="${_csrf.token}" />
</table>
</form:form>

这个AdvertForm类:

代码语言:javascript
复制
public class AdvertForm {
    private Advert advert;
    private List<MultipartFile> images;

    public Advert getAdvert() {
        return advert;
    }

    public void setAdvert(Advert advert) {
        this.advert = advert;
    }

    public List<MultipartFile> getImages() {
        return images;
    }

    public void setImages(List<MultipartFile> images) {
        this.images = images;
    }
}

在相应的控制器中,我使用此参数接收数据:

代码语言:javascript
复制
@ModelAttribute("advertForm") AdvertForm advertForm

问题是当sping-security.xml中的 csrf 被禁用时,它可以正常工作--我可以在advertForm.getImages()中看到所选的文件,但是当我启用csrf时,它停止使用:

代码语言:javascript
复制
Invalid CSRF token found for http://localhost:8080

我试图用以下步骤来解决这个问题:

  1. 我在securityFilterChain之前添加了多部分过滤器: org.springframework.web.multipart.support.MultipartFilter /* encodingFilter /* springSecurityFilterChain /*
  2. 我定义了filterMultipartResolver:<bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="100000000" /></bean>

并将其添加到web.xml中:

代码语言:javascript
复制
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        ......,
        /WEB-INF/springWebMultipartContext.xml
    </param-value>
</context-param>
  1. 在Tomcat 7中启用了CasualMultipartParsing (我使用独立库从IDE运行) Ctx.setAllowCasualMultipartParsing(真)

现在表单工作-我没有收到任何csrf错误。但是当控制器接收到advertForm参数时,advertForm.getImages()返回null,而advertForm.getText()返回用户输入的文本。在日志中,我可以看到这一行:

代码语言:javascript
复制
DEBUG  CommonsMultipartResolver - Found multipart file [images[0]] of size 3117 bytes with original filename [11111111.txt], stored in memory

我的错误在哪里?

EN

回答 1

Stack Overflow用户

发布于 2015-01-07 07:46:19

我忘记提到我定义了这个bean:

代码语言:javascript
复制
<bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

这是个问题。在移除这个bean之后,所有操作都很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27799985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档