You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让MultipartFilter在Spring Boot环境中正常工作

搞定Multipart和Spring Security的兼容问题,目前有两种经过验证的方案:

  • 将MultipartFilter置于Spring Security过滤器链之前
  • 在请求中携带CSRF令牌

方案一:把MultipartFilter放到Spring Security前面

你提到已经在尝试这个方案,我把完整的实现细节整理出来,帮你确认有没有遗漏关键步骤:

  1. 创建SecurityApplicationInitializer类,继承AbstractSecurityWebApplicationInitializer,通过重写beforeSpringSecurityFilterChain方法来插入MultipartFilter:
public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
    @Override
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
        insertFilters(servletContext, new MultipartFilter());
    }
}
  1. 额外提醒:如果你的项目配置了自定义的MultipartResolver,一定要给MultipartFilter指定它的bean名称,不然Spring可能找不到对应的解析器。修改后的代码可以这样写:
@Override
protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
    MultipartFilter multipartFilter = new MultipartFilter();
    // 替换成你自己的MultipartResolver的bean名称
    multipartFilter.setMultipartResolverBeanName("customMultipartResolver");
    insertFilters(servletContext, multipartFilter);
}

方案二:请求中携带CSRF令牌

如果不想调整过滤器顺序,也可以通过在上传请求里携带CSRF令牌来解决:

  • 表单提交场景:在表单里添加一个隐藏的CSRF令牌字段
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
  • AJAX上传场景:把CSRF令牌放在请求头中
// 假设用XMLHttpRequest发送请求
const xhr = new XMLHttpRequest();
xhr.setRequestHeader("${_csrf.headerName}", "${_csrf.token}");
// 后续的上传逻辑...

你可以根据自己项目的实际情况,选择最适合的方案来解决兼容问题~

内容的提问来源于stack exchange,提问作者cdxf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:35:53