如何让MultipartFilter在Spring Boot环境中正常工作
搞定Multipart和Spring Security的兼容问题,目前有两种经过验证的方案:
- 将MultipartFilter置于Spring Security过滤器链之前
- 在请求中携带CSRF令牌
方案一:把MultipartFilter放到Spring Security前面
你提到已经在尝试这个方案,我把完整的实现细节整理出来,帮你确认有没有遗漏关键步骤:
- 创建
SecurityApplicationInitializer类,继承AbstractSecurityWebApplicationInitializer,通过重写beforeSpringSecurityFilterChain方法来插入MultipartFilter:
public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer { @Override protected void beforeSpringSecurityFilterChain(ServletContext servletContext) { insertFilters(servletContext, new MultipartFilter()); } }
- 额外提醒:如果你的项目配置了自定义的
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
相关产品推荐
相关产品推荐

