2014-09-10 3 views
15

나는 dropwizard 응용 프로그램과 js UI에서 api와 상호 작용하기 위해 작업 중입니다. 뷰를 업데이트하기 위해 json 데이터를로드해야하지만 그 전에 dropwizard에서 cors를 활성화해야합니다. 나는 일부 직원을했지만 dropwizard가 allways 204 내용을 반환하지 않기 때문에 작동하지 않는 것 같습니다. 여기dropwizard에서 cors를 작동시키지 못함

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

답변

46

버그 필터가 addMappingForUrlPatterns 방법 통해 URL로 구성되어 있지 않은 점이다.

이 날 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, "/*"); 
} 

난 당신이 브라우저에서이 라이브를 테스트하고 있으리라 믿고있어,하지만이 같은 컬 명령을 사용하여 CLI를 통해 확인할 수 있습니다

$ 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 

Access-Control-* 개의 HTTP 헤더가 응답에 표시됩니다. 마이크 클라크의 대답에 추가

+3

머리글에 Authorization을 추가하는 것이 좋습니다. –

+0

@Mike Clarke Wish 귀하의 의견을 일찍 보았습니다. AngularJS에서 필요 – neric

+0

dropwizard 0.8.4에서는 AngularJS 응용 프로그램에서 작동하도록 "allowedHeaders"를 "*"로 설정해야했습니다. –

3

: 설정

CHAIN_PREFLIGHT_PARAM 거짓 이 필터는 200 응답 될 것을 차단 및 금지/허가받지 않은로 전원 켜기 인증 필터없이 프리 플라이트 요청을 처리하게됩니다.

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

나는이 구성을 포함하는 인터 웹에서 예제를 찾지 못해 놀랐다. 몇 일 동안 이것을 알아 내려고했습니다.

관련 문제