Spring Boot: доступ к XMLHttpRequest на BACK_END 'из источника FRONTEND был заблокирован политикой CORS даже при использовании @CrossOrigin - PullRequest
1 голос
/ 17 января 2020

У меня есть restcontroller, помеченный @CrossOrigin(origins = "*", allowedHeaders = "*"). Однако мой запрос блокируется политикой CORS, несмотря на наличие @CrossOrigin(origins = "*", allowedHeaders = "*") на уровне контроллера.

Access to XMLHttpRequest at 'http://localhost:8080/api/v1/foo/bar' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Ниже приведен набросок кода

import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.CrossOrigin;
import javax.mail.MessagingException;
import javax.validation.Valid;
import java.io.UnsupportedEncodingException;

@CrossOrigin(origins = "*", allowedHeaders = "*")
@RestController
@RequestMapping(path="/api/v1")
@AllArgsConstructor
public class SomeRestController {

    @Autowired
    private SomeService someService;


    @PostMapping(path="/foo/bar")
    public ResponseEntity<RespObject> dosomething(@Valid @RequestBody RequestDTO requestDTO) 
    .
    .
    .
    //somecode
    }
}

API вызывается из приложения Angular Ui.

APIService.ts

create(candidateInititationDto: CandidateInitiationDTO) {
    return this.httpClient.post<RespObject>(
      "http://localhost:8080/api/v1/foo/bar",
      requestDTO
    );
  }
  1. На данный момент это единственный контроллер в этом микро-сервисе, и я попробовал все возможные комбинации @CrossOrigin ( origins = "", allowHeaders = ""), @ CrossOrigin,@CrossOrigin (origins = "*") на уровне контроллера и уровне метода.

Это единственный сервис Micro где @CrossOrigin не работает. Работает нормально во всех других микро сервисах.

Ответы [ 3 ]

2 голосов
/ 17 января 2020

Попробуйте добавить этот Bean к вашему контроллеру:

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**").allowedOrigins("*");
        }
    };
}

Например:

@RestController
@RequestMapping(path="/api/v1")
@AllArgsConstructor
public class SomeRestController {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("*");
            }
        };
    }

    @Autowired
    private SomeService someService;


    @PostMapping(path="/foo/bar")
    public ResponseEntity<RespObject> dosomething(@Valid @RequestBody RequestDTO requestDTO) 
    .
            .
            .
    //somecode
}
1 голос
/ 17 января 2020

Попробуйте удалить источник и разрешенные заголовки и просто используйте

@ CrossOrigin

, это также разрешит все запросы.

0 голосов
/ 18 января 2020

Наконец-то удалось решить проблему. Очевидно, что при рефакторинге кода имя пакета изменилось и не было обнаружено при сканировании пакета. Spring вместо выдачи 404. При предварительном запросе произошел сбой.

Шаги, которые я выполнил для отладки.

  1. Удалите все остальные контроллеры

  2. Продолжайте отладку одного контроллера и метода.

  3. Когда я попытался ударить его почтальоном, он потерпел неудачу, и в этот момент мы узнали, почему он вышел из строя.
  4. Чтобы предотвратить повторение этой катастрофы, был проведен интеграционный тест
  5. . @CrossOrigin(origins = "", allowedHeaders = "") ,@CrossOrigin. Все вышеперечисленные опции будут работать.
  6. Самый безопасный способ - использовать глобальный фильтр CORSS. и белый список orings и сделать его настраиваемым.
...