2016-04-14 17 views
2

エラースクリーンショット:ジャージー - プリフライトリクエストへの応答は、アクセス制御チェックに合格しない:いいえ「アクセス制御 - 許可 - 起源」

enter image description here

を次は私が書かれている中で、私のAPIクラスです@OPTIONSメソッドのコードです。

@OPTIONS 
    public Response OptionsFirstRequst(){ 
     return Response.ok() 
     .header("Access-Control-Allow-Origin", "*") 
     .header("Access-Control-Allow-Methods", "*") 
     .header("Access-Control-Allow-Headers", "*").build(); 
    } 

レスポンスビルダーと呼ばれるクラスを作成しました。これはリクエストごとに応答を送信します。

public class ResponseBuilder { 

    public int status; 
    public HashMap data; 
    public String error; 

    public static Response ok(int Status_code, HashMap<String, String> data, String Response_error) { 
     if (data == null) { 
      data = new HashMap(); 
     } 

     ResponseBuilder response = new ResponseBuilder(); 
     response.status = Status_code; 
     response.data = data; 
     response.error = Response_error; 

     return Response.status(Status_code).entity(response) 
       .header("Access-Control-Allow-Origin", "*") 
       .header("Access-Control-Allow-Methods", "*") 
       .header("Access-Control-Allow-Headers", "*").build(); 
    } 

    public static Response error(int Status_code, HashMap<String, String> data, String Response_error) { 
     if (data == null) { 
      data = new HashMap(); 
     } 

     ResponseBuilder response = new ResponseBuilder(); 
     response.status = Status_code; 
     response.data = data; 
     response.error = Response_error; 
     response.data = new HashMap(); 

     return Response.status(Status_code).entity(response) 
       .header("Access-Control-Allow-Origin", "*") 
       .header("Access-Control-Allow-Methods", "*") 
       .header("Access-Control-Allow-Headers", "*").build(); 
    } 

} 

私もログインを除き、リクエストごとにトークンを検証要求フィルターを持っている: は、次の応答ビルダークラスのコードです。

私はログインし、トークンを生成してブラウザに戻すことができます。 ログイン後、プロフィールをクリックします。

私はレスポンスが200です(ブラウザのdev-toolsネットワークに示されているように)、私はいかなるデータ/正しい応答も得ていません。

また、次のエラーが発生しています。

プリフライト要求に対する応答がアクセス制御チェックに合格していません:要求されたリソースに「アクセス制御許可の原点」ヘッダーがありません。

答えて

2

CORSヘッダーを確認して追加するには、一般的な解決方法はjavax.ws.rs.container.ContainerResponseFilterを使用することです。ここでは許さ起源はクラスApplicationConfig.accessControlAllowedOriginsに設定されている例、:

import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerResponseContext; 
import javax.ws.rs.container.ContainerResponseFilter; 
import javax.ws.rs.core.MultivaluedMap; 
import javax.ws.rs.ext.Provider; 
import java.io.IOException; 

@Provider 
public class ResponseCorsFilter implements ContainerResponseFilter { 

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

     MultivaluedMap<String, Object> responseHeaders = responseContext.getHeaders(); 
     String origin = requestContext.getHeaderString("Origin"); 
     if (null != origin && 
      (ApplicationConfig.accessControlAllowedOrigins.contains(origin) || 
       ApplicationConfig.accessControlAllowedOrigins.contains("*"))) { 

      responseHeaders.putSingle("Access-Control-Allow-Origin", origin); 
      responseHeaders.putSingle("Access-Control-Allow-Methods", 
       "GET, POST, OPTIONS, PUT, DELETE, HEAD"); 

      String reqHead = requestContext.getHeaderString(
       "Access-Control-Request-Headers"); 

      if (null != reqHead && !reqHead.equals("")) { 
       responseHeaders.putSingle("Access-Control-Allow-Headers", reqHead); 
      } 
     } 
    } 
} 
+0

何 'ApplicationConfig.accessControlAllowedOrigins'は' ApplicationConfig'のように見えますか? – antogerva

+0

これは、Access-Control-Allow-Originの値を含む文字列です。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORSe.gをご覧ください。ワイルドカードまたは単一のURL、またはコンマで区切られたURLのリスト。 –