2014-09-10 26 views
15

Sto lavorando a un'applicazione dropwizard e js ui per interagire con l'api. Ho bisogno di caricare dati JSON per aggiornare le viste, ma devo abilitare cors in dropwizard prima. Ho fatto del personale ma sembra non funzionare perché il dropwizard restituisce sempre nessun contenuto.Attivazione cors in dropwizard non funzionante

@Override 
public void run(final BGConfiguration configuration, final Environment environment) throws Exception { 
    final Map<String, String> params = new HashMap<>(); 
    params.put("Access-Control-Allow-Origin", "/*"); 
    params.put("Access-Control-Allow-Credentials", "true"); 
    params.put("Access-Control-Expose-Headers", "true"); 
    params.put("Access-Control-Allow-Headers", "Content-Type, X-Requested-With"); 
    params.put("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); 
    environment.servlets().addFilter("cors", CrossOriginFilter.class).setInitParameters(params); 
} 

risposta

46

Il bug è che il filtro non è stato configurato con un percorso URL tramite il metodo addMappingForUrlPatterns.

questo ha lavorato per me usando dropwizard 0.7.1:

import org.eclipse.jetty.servlets.CrossOriginFilter; 
import javax.servlet.DispatcherType; 
import java.util.EnumSet; 

public void run(Configuration conf, Environment environment) { 
    // Enable CORS headers 
    final FilterRegistration.Dynamic cors = 
     environment.servlets().addFilter("CORS", CrossOriginFilter.class); 

    // Configure CORS parameters 
    cors.setInitParameter("allowedOrigins", "*"); 
    cors.setInitParameter("allowedHeaders", "X-Requested-With,Content-Type,Accept,Origin"); 
    cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); 

    // Add URL mapping 
    cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); 
} 

sto supponendo che si sta testando questo live in un browser, ma si può verificare tramite CLI con un comando ricciolo come questo:

$ curl -H "Origin: http://example.com" \ 
     -H "Access-Control-Request-Method: POST" \ 
     -H "Access-Control-Request-Headers: X-Requested-With" \ 
     -X OPTIONS --verbose \ 
     http://localhost:8080 

Si dovrebbe vedere un gruppo di intestazioni HTTP Access-Control-* nella risposta.

+3

È una buona idea aggiungere un'autorizzazione nelle intestazioni anche se si sta usando quello –

+0

@Mike Clarke Vorrei aver visto il tuo commento prima. Necessario con AngularJS – neric

+0

Per dropwizard 0.8.4, era necessario impostare "allowedHeaders" su "*" per farlo funzionare nell'applicazione AngularJS. –

3

aggiunta alla risposta di Mike Clarke:

Impostazione del CHAIN_PREFLIGHT_PARAM a falso vi permetterà di gestire questo filtro richieste di verifica preliminare, senza i filtri di autenticazione intercettare quello che sarebbe una risposta 200 e trasformarli in non autorizzato/proibito.

import org.eclipse.jetty.servlets.CrossOriginFilter; 
import javax.servlet.DispatcherType; 
import java.util.EnumSet; 

public void run(Configuration conf, Environment environment) { 
    // Enable CORS headers 
    final FilterRegistration.Dynamic cors = 
     environment.servlets().addFilter("CORS", CrossOriginFilter.class); 

    // Configure CORS parameters 
    cors.setInitParameter("allowedOrigins", "*"); 
    cors.setInitParameter("allowedHeaders", "X-Requested-With,Content-Type,Accept,Origin"); 
    cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); 

    // Add URL mapping 
    cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); 

    // DO NOT pass a preflight request to down-stream auth filters 
    // unauthenticated preflight requests should be permitted by spec 
    cors.setInitParameter(CrossOriginFilter.CHAIN_PREFLIGHT_PARAM, Boolean.FALSE.toString()); 
} 

Sono rimasto sorpreso dal fatto che non ho trovato alcun esempio nell'interwebs che includesse questa configurazione. Passato alcuni giorni cercando di capirlo.