当我上传大小小于max-file-size
和max-request-size
的文件时,使用Spring Boot 2.2.0.RELEASE成功上传。当我上传的文件大于这些最大值时,会得到InvalidCsrfTokenException
。
我试图手动将csrf令牌添加到表单中,但这没有用,并且我不想沿用添加令牌作为请求参数的方法。我确实读过一些有关更改多部分过滤器和Spring安全过滤器顺序的内容,以便可以使用csrf令牌,但不确定如何在最新的Boot版本中执行此操作。我还尝试过使用CommonsMultipartResolver
而不成功。
我的application.yml
包含以下内容:
spring:
servlet:
multipart:
enabled: true
file-size-threshold: 0B
location: ${java.io.tmpdir}
max-file-size: 500MB
max-request-size: 500M
和
server:
tomcat:
max-swallow-size: -1
我的AccessDeniedHandler
正在捕获InvalidCsrfTokenException
并重定向到错误页面。我希望csrf令牌在适当的时间可用,这样就不会发生此异常。
更新#1
我设置了spring.security.filter.order = 5并添加了以下代码,但问题仍然存在:
public MultipartFilter multipartFilter() {
MultipartFilter multipartFilter = new MultipartFilter();
multipartFilter.setMultipartResolverBeanName("multipartResolver");
return multipartFilter;
}
@Bean
public FilterRegistrationBean<MultipartFilter> registerMultipartFilter(final MultipartFilter filter) {
final FilterRegistrationBean<MultipartFilter> reg = new FilterRegistrationBean<MultipartFilter>(filter);
reg.setOrder(Ordered.HIGHEST_PRECEDENCE);
return reg;
}
但是问题仍然存在。
更新#2
我已经解决了以下问题:
在我的配置中添加以下内容:
@Bean
public MultipartFilter multipartFilter() {
MultipartFilter multipartFilter = new MultipartFilter();
multipartFilter.setMultipartResolverBeanName("multipartResolver");
return multipartFilter;
}
@Bean
public FilterRegistrationBean<MultipartFilter> registerMultipartFilter(final MultipartFilter filter) {
final FilterRegistrationBean<MultipartFilter> reg = new FilterRegistrationBean<MultipartFilter>(filter);
reg.setOrder(0);
return reg;
}
@Bean
public FilterRegistrationBean<HiddenHttpMethodFilter> registerHiddenHttpMethodFilter(final HiddenHttpMethodFilter filter) {
final FilterRegistrationBean<HiddenHttpMethodFilter> reg = new FilterRegistrationBean<HiddenHttpMethodFilter>(filter);
reg.setOrder(1);
return reg;
}
设置以下属性:
spring:
security:
filter:
order: 5
servlet:
multipart:
enabled: true
file-size-threshold: 0B
location: ${java.io.tmpdir}
max-file-size: 500MB
max-request-size: 500MB
resolve-lazily: true
并且将csrf令牌作为请求参数,并在异常处理程序中捕获生成的MaxUploadSizeExceededException。
我不喜欢在请求中添加csrf令牌,但这是我找到的唯一解决方案。