私はdropwizardアプリケーションと、APIと対話するためのjs uiに取り組んでいます。ビューを更新するにはjsonデータをロードする必要がありますが、その前にdropwizardでcorsを有効にする必要があります。私はいくつかのスタッフをしましたが、dropwizardが常にコンテンツを返さないため、機能していないようです。
@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);
}
ここでのバグは、フィルターが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, "/*");
}
これをブラウザーでライブでテストしていると想定していますが、次のようなcurlコマンドを使用して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ヘッダーが表示されます。
マイク・クラークの答えに追加してください:
CHAIN_PREFLIGHT_PARAM
をfalseに設定すると、認証フィルターが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());
}
この構成を含むインターウェブ上で例を見つけられなかったことに驚きました。数日かけてこれを理解しようとしました。
上記を設定した後でも、私はそれが機能していませんでした。最終的には、キャッシュ制御ヘッダーも許可する必要があることがわかりました。
filter.setInitParameter("allowedHeaders",
"Cache-Control,If-Modified-Since,Pragma,Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin");
これを試すことができます:
final FilterRegistration.Dynamic cors =
environment.servlets().addFilter("CORS", CrossOriginFilter.class);
// Configure CORS parameters
// Configure CORS parameters
cors.setInitParameter("allowedOrigins", "*");
cors.setInitParameter("allowedHeaders", “<Headers>”);
cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,");
// Add URL mapping
cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");