当超过文件上传最大文件大小时,Spring Boot 2.2.0.RELEASE引发InvalidCsrfTokenException

时间:2019-10-29 15:26:50

标签: spring spring-boot

当我上传大小小于max-file-sizemax-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令牌,但这是我找到的唯一解决方案。

0 个答案:

没有答案