Spring Boot 2.2.0.RELEASE在超过文件上载最大文件大小时引发InvalidCsrTokenException

Spring Boot 2.2.0.RELEASE在超过文件上载最大文件大小时引发InvalidCsrTokenException,spring,spring-boot,Spring,Spring Boot,使用Spring Boot 2.2.0.RELEASE,当我上载大小小于max file size和max request size的文件时,上载成功。当我上传一个大于这些最大值的文件时,我会得到一个InvalidCsrfTokenException 我曾尝试将csrf令牌手动添加到表单中,但这不起作用,我不想继续将令牌作为请求参数添加。我确实读过一些关于更改多部分过滤器和Spring安全过滤器的顺序以便csrf令牌可用的文章,但不确定如何在最新的启动版本中做到这一点。我还尝试过使用common

使用Spring Boot 2.2.0.RELEASE,当我上载大小小于
max file size
max request size
的文件时,上载成功。当我上传一个大于这些最大值的文件时,我会得到一个
InvalidCsrfTokenException

我曾尝试将csrf令牌手动添加到表单中,但这不起作用,我不想继续将令牌作为请求参数添加。我确实读过一些关于更改多部分过滤器和Spring安全过滤器的顺序以便csrf令牌可用的文章,但不确定如何在最新的启动版本中做到这一点。我还尝试过使用
commonmultipartresolver
,但没有成功

我的
应用程序.yml
包含以下内容:

spring:
  servlet:
    multipart:
      enabled: true
      file-size-threshold: 0B
      location: ${java.io.tmpdir}
      max-file-size: 500MB
      max-request-size: 500M

我的
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;
}
包括csrf令牌作为请求参数,并在异常处理程序中捕获生成的MaxUploadSizeExceedeException


我不喜欢将csrf令牌添加到请求中,但这是我找到的唯一解决方案。

您需要一个
MultipartFilter
来正确使用Spring Security。这在参考指南中有解释,此后没有更改,因此它的工作原理应该与旧版本的Spring Security中的相同。上面提到的Spring.servlet.multipart.enabled是否启用了此功能?不,它只启用文件上载,不添加过滤器。我添加了MultipartFilter过滤器,但相同的问题仍然存在。如果过滤器不存在,那么小于最大大小的文件不会也失败吗?问题是,如果没有过滤器,文件上传将在安全过滤器后面的DispatcherServlet中处理。您需要确保在安全筛选器之前添加筛选器。您需要一个
MultipartFilter
来正确使用Spring security。这在参考指南中有解释,此后没有更改,因此它的工作原理应该与旧版本的Spring Security中的相同。上面提到的Spring.servlet.multipart.enabled是否启用了此功能?不,它只启用文件上载,不添加过滤器。我添加了MultipartFilter过滤器,但相同的问题仍然存在。如果过滤器不存在,那么小于最大大小的文件不会也失败吗?问题是,如果没有过滤器,文件上传将在安全过滤器后面的DispatcherServlet中处理。您需要确保在安全筛选器之前添加筛选器。
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;
}
@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