2017-03-29 1 views
1

JAX-RSを使用して構築されたRESTエンドポイントに接続しようとしていますが、 Control-Allow-Origin 'は存在しません。 Angular2でリソースを取得しようとしています。私はhttps://stackoverflow.com/a/30450944で提示ソリューションを試してみましたJAX-RS Access-Control-Allow-Originヘッダーが存在しませんが、ResponseFilterで追加されました

を試してみた何

マイ応答フィルタ:

@Provider 
@PreMatching 
public class ResponseFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { 
     responseContext.getHeaders().add("Access-Control-Allow-Origin", "*"); 
     responseContext.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); 
     responseContext.getHeaders().add("Access-Control-Allow-Credentials", "true"); 
     responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
    } 
} 

そして、私のweb.xmlサーブレットマッピング:

<servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <init-param> 
      <param-name>jersey.config.server.provider.classnames</param-name> 
      <param-value>com.api.ResponseFilter</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

アップデート1

responseContext.getHeaders().add(...); 
更新しました〜

responseContext.getHeaders.putSingle(...); 

でも、私はまだ同じエラーが発生しています。 郵便配達でテストしている間、私は戻って正しいヘッダを取得しています。アプリケーションを拡張して、私のJAXRSConfig、で

Access-Control-Allow-Credentials →true 
Access-Control-Allow-Headers →origin, content-type, accept, authorization 
Access-Control-Allow-Methods →GET, POST, PUT, DELETE, OPTIONS, HEAD 
Access-Control-Allow-Origin →* 

を更新2

、私は手動で、おそらく必要なすべてのリソースを追加しました:

@ApplicationPath("api") 
public class JAXRSConfig extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> resources = new HashSet<>(); 
     addRestResourceClasses(resources); 
     return resources; 
    } 

    private void addRestResourceClasses(Set<Class<?>> resources) { 
     resources.add(AdminResource.class); 
     resources.add(RequestFilter.class); 
     resources.add(ResponseFilter.class); 
     resources.add(TweetResource.class); 
     resources.add(UserResource.class); 
    } 
} 

ブレークポイントを使用して、Postman経由でGETリクエストを送信したときにResponseFilterが呼び出されることに気がつきましたが、私はaからGETリクエストを送信したときに呼び出されませんngularアプリケーション。

要求を送信するために私の角度コード:

let headers = new Headers({'Authorization': authToken}); 
    headers.append('Content-Type', 'application/json'); 

    let options = new RequestOptions({ headers: headers}); 

    return this.http.get(http://localhost:8080/api/object/user) 
     .map((res:Response) => res.json()) 
     .catch((error:any) => Observable.throw(error.json().error || 'Server error')); 

アップデート3

私は、私が実際に要求に定義されたヘッダを追加しませんでした実現しませんでした。私はに私の角度のコードを更新しました:

let authToken = "Basic " + btoa("henk:asdf");//temporary until I learn how to allow a user to log in, in angular 
    let headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 
    headers.append('Authorization', authToken); 

    //let options = new RequestOptions({ headers: headers}); 

    return this.http.get(this.myUrl, {headers: headers}) 
     .map((res:Response) => res.json()) 
     .catch((error:any) => Observable.throw(error.json().error || 'Server error')); 

更新4

私が学んだので、これは経由して、原因を実行クローム(および他のブラウザ)を確認飛行前にすることができましたOPTIONSと呼ばれるリクエストメソッド。私は次のようにリクエストフィルタをAPIに追加しました:

しかし、役に立たないです。 ifステートメントのブレークポイントでは、このメソッドはangleからのGETリクエストで呼び出されるのではなく、Postmanからのリクエストから呼び出されることがわかりました。

また、私はhttps://stackoverflow.com/a/19902666/6795661に従って別のCORSフィルタを試しました。 しかし、これはうまくいきませんでした。

更新5

Iは、応答に必要なヘッダ(単数または複数)を追加する、は、javax.servlet.Filterを実装するクラスを作成しようとしたpeeskilletあたりとおりで

public class ContainerResponseFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 

    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse res = (HttpServletResponse) response; 
     res.addHeader("Access-Control-Allow-Origin", "http://localhost:4200"); 
     res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); 
     res.addHeader("Access-Control-Allow-Headers", "Content-Type"); 
     chain.doFilter(request, response); 
    } 

    @Override 
    public void destroy() { 

    } 
} 

私のweb.xml内の対応するマッピング:

<filter> 
     <filter-name>corsfilter</filter-name> 
     <filter-class>com.api.ContainerResponseFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>corsfilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

そして私はApplicatのリソースとしてContainerResponseFilterを追加しましたイオン構成。 残念ながら、私はまだ 'Access-Control-Allow-Origin'ヘッダーが存在しないというエラーを受けています。

+1

角度リクエストで基本認証を使用しています。どのようなタイプのセキュリティ(アーキテクチャ)を使用していますか?一部のサーブレットレベルのフィルタ(Sprig Securityなど)を使用している場合、Jerseyに到達する前にサーブレットレベルのフィルタが常に呼び出されるため、Jerseyフィルタは呼び出されません。あなたはこの種のセキュリティーアーキテクチャーを持っていて、ジャージーレベルではなく、CORSを_that_レベルに設定します。 –

+0

郵便配達で働く理由は、郵便配達員がCORSサポートを必要としないことです。 –

+1

JAASを基本認証の設定では、jdbcレルム内のユーザー名とパスワードの組み合わせをチェックします。私はこれを私のアプリケーションサーバー(Payara)で設定しました。基本認証では、GETリクエストには、認証ヘッダーと、ユーザー名とパスワードのbase64でエンコードされた文字列が必要です。これは、アップデート3の下に表示されています。アップデート4の最後にあるように、私のweb.xmlにはサーブレットマッピングがありますが、これはうまくいきませんでした。 –

答えて

1

明らかに、問題は認証にありました。私のアプリケーションサーバーはリクエストを認証しようとしていましたが、認証前にCORSチェックが行われていたので、必要なヘッダーを含まない不正な応答がありました。

関連する問題