2016-06-23 29 views
18

Sto provando a configurare CORS globalmente tramite WebMvcConfigurerAdapter mostrato di seguito. Per testare sto colpendo il mio endpoint API tramite un'app di piccolo nodo che ho creato per emulare un servizio esterno. Quando provo questo approccio la risposta non contiene le intestazioni corrette e non riesce conSpring Global CORS configuration non funziona ma Controller config level

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. 

globale 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); 
     } 
} 

Tuttavia quando utilizzare il @CrossOrigin annotazione in questo modo funziona bene rispondendo con le intestazioni appropriate .

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

Produce

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

Che cosa mi manca per far funzionare la configurazione globale (istruzioni seguite qui https://spring.io/blog/2015/06/08/cors-support-in-spring-framework). Mi sento come se mi mancasse qualcosa di semplice da quando l'annotazione del controller funziona bene.

+0

Forse '.allowedOrigins (" * ").allowedHeaders ("*") 'sono ridondanti nella configurazione globale –

risposta

0

penso che la tua definizione di mapping manca un *:

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

Senza quel qualcosa in più *, questa configurazione non è mappato al percorso /api/query/1121 richiesta (ma dovrebbe funzionare su /api/query/5).

+1

Grazie per la risposta, ho anche provato' "/ api/query/**" 'e non ha funzionato. Inizialmente avevo persino un'implementazione di tipo "Hello World" con 'registry.addMapping ("/** ")' e questo non ha fatto la differenza .. devo specificare in qualche modo che si trovi sulla porta 8080? Non so nemmeno ... sembra che dovrebbe funzionare bene –

4

in cui non è stato dichiarato il metodo in esso che per impostazione predefinita accetta solo il metodo get. provare registry.allowedMethods("*");

+0

Sto affrontando lo stesso problema con il metodo POST. risolto con l'aggiunta di metodi consentiti. –

7

Per far funzionare la configurazione globale di CORS, il client deve aggiungere queste due intestazioni nella richiesta OPZIONI.

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

Tuttavia l'annotazione @CrossOrigin richiede solo l'intestazione "Origin".
Il tuo client probabilmente aggiunge l'intestazione "Origin" ma manca il "Access-Control-Request-Method" ..... ecco perché funziona con te con @CrossOrigin, ma non con la configurazione globale.

0

Ho affrontato un problema simile. Ho cambiato WebMvcConfigurerAdapter in WebMvcConfigurationSupport e ha iniziato a funzionare.

Oltre a ciò, ho spostato anche il RequestMappingHandlerMapping definito nel file di configurazione xml nella configurazione java.

0

Sono riuscito a far funzionare la configurazione Spring Global CORS, dopo aver riscontrato l'esatto problema documentato in questo numero. Ho dovuto fare 2 cose:

  1. allowedOrigins non possono essere * Se allowCredentials è vero. Ciò è documentato su Mozilla.org

  2. Rimuovi mvc: annotazione guidata dall'XML di primavera. Non può avere ENTRAMBI la config XML e @EnableWebMvc. La classe globale non funzionerà senza @EnableWebMvc, quindi mvc: annotation-driven deve essere rimosso.

Problemi correlati