CORS не работает с Spring Boot при возникновении исключения MaxUploadSizeExceededException ⇐ JAVA
CORS не работает с Spring Boot при возникновении исключения MaxUploadSizeExceededException
Я реализую службу REST с помощью Spring Boot для загрузки файла, выполняющего многочастный запрос POST. Я установил максимальный размер файла в файле application.yml, как показано ниже:
весна: сервлет: многочастный: включено: правда максимальный размер файла: 1 МБ максимальный размер запроса: 1 МБ Мой сервис также реализует политику CORS, позволяющую разрешать запросы от клиентского приложения, размещенного на сервере React разработки:
@EnableWebSecurity @EnableMethodSecurity @Конфигурация публичный класс SecurityConfig реализует WebMvcConfigurer { @Value("${security.cors-origin:}") частная строка разрешенаOrigin; @Бин public SecurityFilterChain securityFilterChain (HttpSecurity http, декодер JwtDecoder, интроспектор HandlerMappingIntrospector) выдает исключение { вернуть http .csrf(httpSecurityCsrfConfigurer -> httpSecurityCsrfConfigurer.disable()) .authorizeHttpRequests(authCustomizer -> authCustomizer.requestMatchers(new MvcRequestMatcher(introspector, "/actuator/**")).permitAll()) .authorizeHttpRequests(authCustomizer -> authCustomizer.requestMatchers(new MvcRequestMatcher(introspector, "/integration/**")).permitAll()) .authorizeHttpRequests(authCustomizer -> authCustomizer.anyRequest().authenticated()) .oauth2ResourceServer(oauth2 -> oauth2.jwt(jwt -> jwt.decoder(декодер))) .sessionManagement(sessionCustomizer -> sessionCustomizer.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .строить(); } /** * Добавьте указанный хост в разрешенный источник для совместного использования ресурсов между источниками. * * Это необходимо при разработке как источник внешнего интерфейса (localhost:3000). * отличается от источника серверной части (localhost:8080) * * Реестр @param — CorsRegistry, который будет использоваться для добавления разрешенного источника. */ @Override @ConditionalOnProperty(prefix = "security", name="cors-origin") public void addCorsMappings (реестр CorsRegistry) { реестр.addMapping("/**") .allowedOrigins(allowedOrigin) .allowCredentials(истина) ; } } У меня также есть ControllerAdvice для обработки исключений, создаваемых контроллерами и Spring:
@RestControllerAdvice @Slf4j публичный класс GlobalControllerExceptionHandler расширяет ResponseEntityExceptionHandler { @ExceptionHandler({ MaxUploadSizeExceededException.class }) @ResponseStatus (значение = HttpStatus.BAD_REQUEST) public FileUploadErrorMessage handleMaxUploadSizeExceededException (MaxUploadSizeExceededException ex, запрос WebRequest) { FileUploadErrorMessage errorMessage = новый FileUploadErrorMessage("inputValidation", "неверный файл"); ValidationResult validationResult = новый ValidationResult("invalid.logo.size"); errorMessage.setErrors(new ArrayList(Collections.singleton(validationResult))); вернуть сообщение об ошибке; } } Проблема в том, что при использовании исключения MaxUploadSizeExceededException Spring Web не добавляет заголовок Access-Control-Allow-Origin в ответ об ошибке. Он отлично работает для других исключений (выброшенных контроллерами). Я думал, это потому, что запрос не проходит через какие-либо контроллеры, поскольку он заблокирован платформой (которая выдает исключение), но странно то, что если я не обрабатываю исключение MaxUploadSizeExceededException в приведенном выше ControllerAdvice, Spring возвращает 500 Internal ошибка с телом ответа и заголовком CORS!
Может ли кто-нибудь объяснить такое поведение и знает, как его исправить?
Я реализую службу REST с помощью Spring Boot для загрузки файла, выполняющего многочастный запрос POST. Я установил максимальный размер файла в файле application.yml, как показано ниже:
весна: сервлет: многочастный: включено: правда максимальный размер файла: 1 МБ максимальный размер запроса: 1 МБ Мой сервис также реализует политику CORS, позволяющую разрешать запросы от клиентского приложения, размещенного на сервере React разработки:
@EnableWebSecurity @EnableMethodSecurity @Конфигурация публичный класс SecurityConfig реализует WebMvcConfigurer { @Value("${security.cors-origin:}") частная строка разрешенаOrigin; @Бин public SecurityFilterChain securityFilterChain (HttpSecurity http, декодер JwtDecoder, интроспектор HandlerMappingIntrospector) выдает исключение { вернуть http .csrf(httpSecurityCsrfConfigurer -> httpSecurityCsrfConfigurer.disable()) .authorizeHttpRequests(authCustomizer -> authCustomizer.requestMatchers(new MvcRequestMatcher(introspector, "/actuator/**")).permitAll()) .authorizeHttpRequests(authCustomizer -> authCustomizer.requestMatchers(new MvcRequestMatcher(introspector, "/integration/**")).permitAll()) .authorizeHttpRequests(authCustomizer -> authCustomizer.anyRequest().authenticated()) .oauth2ResourceServer(oauth2 -> oauth2.jwt(jwt -> jwt.decoder(декодер))) .sessionManagement(sessionCustomizer -> sessionCustomizer.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .строить(); } /** * Добавьте указанный хост в разрешенный источник для совместного использования ресурсов между источниками. * * Это необходимо при разработке как источник внешнего интерфейса (localhost:3000). * отличается от источника серверной части (localhost:8080) * * Реестр @param — CorsRegistry, который будет использоваться для добавления разрешенного источника. */ @Override @ConditionalOnProperty(prefix = "security", name="cors-origin") public void addCorsMappings (реестр CorsRegistry) { реестр.addMapping("/**") .allowedOrigins(allowedOrigin) .allowCredentials(истина) ; } } У меня также есть ControllerAdvice для обработки исключений, создаваемых контроллерами и Spring:
@RestControllerAdvice @Slf4j публичный класс GlobalControllerExceptionHandler расширяет ResponseEntityExceptionHandler { @ExceptionHandler({ MaxUploadSizeExceededException.class }) @ResponseStatus (значение = HttpStatus.BAD_REQUEST) public FileUploadErrorMessage handleMaxUploadSizeExceededException (MaxUploadSizeExceededException ex, запрос WebRequest) { FileUploadErrorMessage errorMessage = новый FileUploadErrorMessage("inputValidation", "неверный файл"); ValidationResult validationResult = новый ValidationResult("invalid.logo.size"); errorMessage.setErrors(new ArrayList(Collections.singleton(validationResult))); вернуть сообщение об ошибке; } } Проблема в том, что при использовании исключения MaxUploadSizeExceededException Spring Web не добавляет заголовок Access-Control-Allow-Origin в ответ об ошибке. Он отлично работает для других исключений (выброшенных контроллерами). Я думал, это потому, что запрос не проходит через какие-либо контроллеры, поскольку он заблокирован платформой (которая выдает исключение), но странно то, что если я не обрабатываю исключение MaxUploadSizeExceededException в приведенном выше ControllerAdvice, Spring возвращает 500 Internal ошибка с телом ответа и заголовком CORS!
Может ли кто-нибудь объяснить такое поведение и знает, как его исправить?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение