Spring Boot 2.2.0.RELEASE在超过文件上载最大文件大小时引发InvalidCsrTokenException
使用Spring Boot 2.2.0.RELEASE,当我上载大小小于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
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