Grizzlyサーバーは、Jerseyを使用してRESTインターフェイスを提供するlocalhost:8080上で実行されています。Grizzlyによって作成されたCORSヘッダーがクライアントによって常に認識されない
CorsFilterクラスは、CORSヘッダーの作成を担当します。それはGrizzlyServerのリソースの設定に追加されます。
@Provider
public class CorsFilter implements ContainerResponseFilter {
private final String HEADERS = "Origin, Content-Type, Accept";
@Override
public void filter(ContainerRequestContext request, ContainerResponseContext response) throws IOException {
response.getHeaders().add("Access-Control-Allow-Origin", "*");
response.getHeaders().add("Access-Control-Allow-Headers", HEADERS);
response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
}
}
はRESTハンドラを表す2つのクラスがあります: my.application.apiここ
final ResourceConfig rc = new ResourceConfig()
.packages("my.application.api.rest")
.register(new CorsFilter());
GrizzlyHttpServerFactory.createHttpServer(uri, rc); // uri defined earlier
別のポストに見られるようなCorsFilterクラスがあります.rest.A.class my.application.api.rest.B.class
リソースAとBの両方がPOSTハンドラを持っている:
@Path("/A")
public class A {
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response handlePost()
{
Object payload = getPayload();
return Response.ok(payload).build();
}
}
BはAと似ています。
クライアントはlocalhost:3000のローカルノードサーバーでホストされているAngularJSベースのWebアプリケーションです。/A及び/ BへのポストはRestangularを使用して行われる:
Restangular.all('A').post({
key: value
});
AにPOSTは全ての利用可能なブラウザ(クローム、サファリ、Firefoxの)によって実行されているが、Bに対して同じPOSTが原因以下に実行されませんエラー:
XMLHttpRequest cannot load http://localhost:8080/myapplication/B. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 500.
CorsFilterによって追加されたヘッダーがどこかで失われているとします。
郵便配達員がAとBのPOSTは正常に動作し、ヘッダー「Access-Control-Allow-Origin:*」は常に存在します。
クロムでテストしますか? - http://stackoverflow.com/a/10892392/775715 –
@JoakimErdfeltいいえ、だけでなく。ブラウザはSafari、Chrome、Firefoxです – JCvanDamme