2014-09-10 13 views
15

Pracuję nad aplikacją dropwizard i js ui do interakcji z interfejsem API. Muszę załadować dane json, aby zaktualizować widoki, ale muszę wcześniej włączyć cors w Dropwizard. Zrobiłem trochę pracowników, ale wygląda na to, że nie działa, ponieważ program Dropwizard zawsze zwraca 204 treści.Włączanie cors w dropwizard nie działa

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

Odpowiedz

46

Błąd tutaj jest to, że filtr nie został skonfigurowany ze ścieżką URL metodą addMappingForUrlPatterns.

Ten pracował dla mnie za pomocą 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, "/*"); 
} 

Jestem zakładając testujesz to na żywo w przeglądarce, ale można zweryfikować poprzez CLI z zwinięcie polecenia jak poniżej:

$ 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 

Powinieneś zobaczyć szereg nagłówków HTTP Access-Control-* w odpowiedzi.

+3

Dobrym pomysłem jest dodanie autoryzacji w nagłówkach, jeśli używasz tego –

+0

@Mike Clarke Wish Widziałem Twój komentarz wcześniej. Niezbędne z AngularJS – neric

+0

Dla dropwizard 0.8.4 musieliśmy ustawić "allowedHeaders" na "*", aby działało w aplikacji AngularJS. –

3

Dodawanie do Mike'a Clarke'a odpowiedź:

Ustawianie CHAIN_PREFLIGHT_PARAM do fałszywy pozwoli to filtr obsłużyć żądania inspekcji wstępnej bez filtrów uwierzytelniania przechwytując co byłoby odpowiedzią 200 i zamieniając je w nieautoryzowany/zabronione.

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

Byłem zaskoczony, że nie znalazłem żadnych przykładów na interwebs, które zawierały tę konfigurację. Spędziłem kilka dni próbując to rozgryźć.