Несмотря на наличие функции для CORS, приложение Spring отвечает 406 - PullRequest
0 голосов
/ 14 марта 2020

Предположим, что Project - это наш класс POJO. Следующая функция обеспечивает удаление строки из базы данных. Он успешно работает с запросами POSTMAN.

@RestController
@RequestMapping(value = "/project")
@CrossOrigin
public class ProjectController {

    private final ProjectServiceImpl projectServiceImpl;

    ------------
    @DeleteMapping
    @RequestMapping("/delete/{id}")
    public ResponseEntity<Boolean> deleteProject(@PathVariable Long id) {
        boolean result = projectServiceImpl.delete(id);
        return ResponseEntity.ok(result);
    }
    ------------
}

Но запросы из проекта Angular отклоняются с сообщением 403. И на экране консоли появляется следующее сообщение:

Angular error without pre-flight

После некоторых поисков. Я узнал, что приложение должно отвечать на pre-flight запросов с 200. Чтобы обеспечить это, в контроллер была добавлена ​​следующая функция:

@GetMapping
@RequestMapping("/delete/{id:[0-9]+}")
public ResponseEntity.BodyBuilder retreive(@PathVariable Long id) {
    return ResponseEntity.ok();
}

Я использовал регулярное выражение для отображения запросов, потому что без него Spring Framework выбрасывает /project/delete/{id} уже сопоставлены с другой функцией. Angular получите свой 200OK для pre-flight запроса таким способом. Но ответ приложения 406 для операции удаления. Angular отправляет http://localhost:8080/project/delete/2 URL в приложение. Если я отправлю ту же ссылку без функции для CORS. Строка с идентификатором 2 удалится успешно. Я что-то упустил?

Console error despite have a CORS support

Источники:

Почему Angular отправляет сообщение OPTIONS перед DELETE

Как добавить поддержку CORS в приложение Spring Boot

Для реализации прокси на стороне сервера: proxy.conf. json

{
  "/project/**": {
    "target": "http://localhost:8080",
    "secure": false
  }
}

измененный раздел в angular. json

    "serve": {
      "builder": "@angular-devkit/build-angular:dev-server",
      "options": {
        "browserTarget": "issue-management:build",
        "proxyConfig": "proxy.conf.json"
      },

и Angular проект начался с ng serve --proxy-config proxy.conf.json, но результат не изменился. Плюс, предложения в этой статье применены, опять же результат не изменился.

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Если вы используете пружинную защиту, используйте следующее:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // by default uses a Bean by the name of corsConfigurationSource
            .cors(withDefaults())
            ...
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

См. Пружинную документацию: https://docs.spring.io/spring-security/site/docs/current/reference/html5/#cors

Глобальная конфигурация:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Value("${cors.origins.urls}")
    public String allowedOrigins;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedOrigins(allowedOrigins.split(","));

    }
}
1 голос
/ 14 марта 2020

Ваши приложения работают на двух разных портах, что вызывает проблему с CORS.

Добавьте прокси (файл proxy.conf. json) в ваше приложение Angular.

{
    "/project/**": {
        "target": "http://localhost:8080",
        "secure": false
    }
}

и запустите ng serve --proxy-config proxy.conf.json

Reference: Angular do c


Обновление:

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
            .allowedMethods("*")
            .allowedOrigins("http://localhost:4200");
        }
    };
}

сработало , Почему-то Angular прокси не работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...