2016-06-23 2 views
18

Я пытаюсь настроить CORS по всему миру через WebMvcConfigurerAdapter, показанный ниже. Чтобы проверить, я ударил свою конечную точку API через приложение небольшого узла, которое я создал для эмуляции внешней службы. Когда я попробовать этот подход ответ не содержит правильные заголовки и не сКонфигурация Spring Global CORS не работает, но конфигурация уровня контроллера

XMLHttpRequest cannot load http://localhost:8080/api/query/1121. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:333' is therefore not allowed access. 

Global Config

import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.config.annotation.CorsRegistry; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 

@EnableWebMvc 
@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 
     @Override 
     public void addCorsMappings(CorsRegistry registry) { 
      registry.addMapping("/api/query/**") 
        .allowedOrigins("*") 
        .allowedHeaders("*") 
        .allowCredentials(true); 
     } 
} 

Однако когда я использовать @CrossOrigin аннотацию как и она работает просто отлично реагирует с соответствующими заголовками ,

@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*") 
@RestController 
@RequestMapping(value = "/api/query", produces = MediaType.APPLICATION_JSON_VALUE) 
public class QueryController { 
    ...... 
} 

Производит

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Origin:http://localhost:333 

Что мне не хватает, чтобы сделать глобальную конфигурационную работу (следовал инструкциям здесь https://spring.io/blog/2015/06/08/cors-support-in-spring-framework). Я чувствую, что мне не хватает чего-то простого, так как аннотация контроллера работает нормально.

+0

Возможно, '.allowedOrigins (" * ").allowedHeaders ("*") 'избыточны в глобальной конфигурации. –

ответ

0

Я думаю, что ваше определение отображения отсутствует *:

registry.addMapping("/api/query/**") 

Без этой дополнительной *, эта конфигурация не отображается на путь /api/query/1121 запроса (но он будет работать на /api/query/5).

+1

Спасибо за ваш ответ, я также попробовал'/api/query/** "', и это не сработало. Первоначально у меня даже была реализация типа «hello world» с 'registry.addMapping ("/** ")', и это не имело значения. Должен ли я как-то указать, что он находится на порту 8080? Я даже не знаю ... похоже, что он должен работать нормально –

4

Вы не объявили в нем метод, который по умолчанию принимает только метод get. try registry.allowedMethods("*");

+0

Я столкнулся с той же проблемой с методом POST. он решил, добавив allowmethods. –

7

Для того чтобы глобальная конфигурация CORS работала, клиент должен добавить эти два заголовка в запрос OPTIONS.

Origin: http://host.com 
Access-Control-Request-Method: POST 

Однако для аннотации @CrossOrigin требуется только заголовок «Origin».
Ваш клиент, вероятно, добавляет заголовок «Origin», но не имеет «Access-Control-Request-Method» ..... вот почему он работает для вас с @CrossOrigin, но не с глобальной конфигурацией.

0

Я столкнулся с подобной проблемой. Я изменил WebMvcConfigurerAdapter на WebMvcConfigurationSupport и начал работать.

В дополнение к этому я также переместил RequestMappingHandlerMapping, определенный в файле конфигурации xml, в конфигурацию java.

0

Я смог получить конфигурацию Spring Global CORS, после того как вы столкнулись с конкретной проблемой, описанной в этой проблеме. Мне пришлось сделать 2 вещи:

  1. РазрешеноОригина не может быть *, если allowCredentials истинно. Это задокументировано в Mozilla.org

  2. Удалить mvc: аннотация, управляемая из весеннего XML. Не может иметь BOTH конфигурацию XML и @EnableWebMvc. Глобальный класс не будет работать без @EnableWebMvc, поэтому mvc: аннотация должна быть удалена.

Смежные вопросы