Использование Spring Boot 2.2.0.RELEASE, когда я загружаю файлы, размер которых меньше max-file-size
и max-request-size
загрузка успешно завершена. Когда я загружаю файл больше этих максимумов, я получаю InvalidCsrfTokenException
.
. Я пытался вручную добавить токен csrf в форму, но это не сработало, и я не хочу идти по маршрутудобавления токена в качестве параметра запроса. Я кое-что прочитал об изменении порядка составного фильтра и фильтров безопасности Spring, чтобы токен csrf был доступен, но не знал, как это сделать с последним выпуском Boot. Я также пытался использовать CommonsMultipartResolver
безуспешно.
My 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
My 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 в запрос, но это единственное решение, которое я нашел.