2016-10-19 12 views
0

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:*」は常に存在します。

+0

クロムでテストしますか? - http://stackoverflow.com/a/10892392/775715 –

+0

@JoakimErdfeltいいえ、だけでなく。ブラウザはSafari、Chrome、Firefoxです – JCvanDamme

答えて

0

脚注のpost()メソッドを使用する代わりに、customPOST()メソッドを使用する必要がありました。

関連する問題