2017-11-14 4 views
0

私は2つの異なった上で(奉仕するのWebPACKを使用してアンギュラ4)私のバックエンド(JavaはTomcatのサーバ上ジャージーを使用)、フロントエンドをテストしていポート、したがって私はcorsアクセス制御の起源ブロックを取得しています。私のgetメソッドでは、すべて正常に動作し、要求されたデータはすべてUIで見つかります。今私は自分のPOSTメソッドをテストしていて、タイトルに同じメッセージが表示されています。理由:CORSヘッダー「アクセス制御 - 許可 - 起源」明示的にJavaリソースに次の特定にもかかわらず、行方不明

マイポストメソッドは、それに送られたデータを永続化し、新しい持続エンティティの位置で応答を返す必要があります。 Firefoxブラウザでの私のネットワークタブで

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public Response persistAccountLocation(AccountLocation entity) throws URISyntaxException { 


    accountLocationService.persist(entity); 

    JsonObject object = Json.createObjectBuilder() 
      .add("location", "api/v1/accounts_locations/"+entity.getLocation_id()).build(); 

    return Response.status(Response.Status.CREATED)// 201 
      .entity("Location created") 
      .header("Access-Control-Allow-Origin","*") 
      .header("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE") 
      .allow("OPTIONS") 
      .entity(object.toString()).build(); 
} 

私は200個のステータス

Host: localhost:8081 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: access-control-allow-origin,content-type 
Origin: http://localhost:4200 
Connection: keep-alive 

でなく、ポストが起こることはありませんされていることを後にOPTIONSを参照してください。私はCORSがその時点でブロックしていると仮定しています。リソースクラスの他にアクセス制御を許可する必要がある別の場所がありますか?私は、典型的なすべてのCORSの設定がサーバー側で行われていることを読んでいます。全く失われた。すべてのフィードバックは

EDIT

public class CORSResponseFilter 
implements ContainerResponseFilter { 

    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) 
      throws IOException { 

     MultivaluedMap<String, Object> headers = responseContext.getHeaders(); 

     headers.add("Access-Control-Allow-Origin", "*");  
     headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS");   
     headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type,"); 
    } 

} 

に感謝私は微調整とフィルタを作り、私のアプリにそれを登録し

public class JaxRsApplication extends ResourceConfig{ 
    public JaxRsApplication() { 

     // register application resources - unmapped resources will throw exception 
     register(AccountLocationResource.class); 

     register(CORSResponseFilter.class); 
    } 
+0

もう一つ、私が気づきましたか? CORSを手作業で書くことはお勧めできません(実際にはサーバーに2つのリクエストが含まれます)。 –

+0

@AlehMaksimovich jax-rsにジャージを使用する。それは私のコンテナです。少なくとも私はそう思う。この用語の私の理解は、私にはまだ新しいですhttps://jersey.github.io/ – overboard182

+0

@ overboard182これを解決できましたか?はいの場合、どうですか? –

答えて

0

かなり良い答えがHow to handle CORS using JAX-RS with Jersey stackoverflowの質問に提供されています。

あなたはジャージー1へのリンクを与えていますが、使用しているバージョンを確認してくださいしています。

あなたがリクエストごとに

 .header("Access-Control-Allow-Origin","*") 
     .header("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE") 
     .allow("OPTIONS") 

を書く必要はありませんこの方法です。フィルタによってオプションが適用されます。

使用しているどのようなJAX-RSのコンテナ/エンジン

return Response.status(Response.Status.CREATED)// 201 
     .entity("Location created") // <- entity() call here 
     .header("Access-Control-Allow-Origin","*") 
     .header("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE") 
     .allow("OPTIONS") 
     .entity(object.toString()).build(); // <- one more entity() call here (not sure what effect it may have) 
+0

ご連絡ありがとうございます。私は適切な変更を加えました。私とこの問題にまだ取り組んでいるのであれば編集を見てください:) – overboard182

関連する問題