2016-07-12 8 views
1

クロスドメインのAJAXリクエストを作成していません。しかし、私はまだCROSS関連のエラーが発生しています。これはChromeでのみ発生します。 FirefoxとSafariは正常に動作します。ChromeのCORSエラー

エラー: 「プリフライトリクエストへの応答は、アクセス制御チェックに合格しない:いいえ 『アクセス制御 - 許可 - 起源』ヘッダは、要求されたリソース上に存在しています。」

設定は次のとおりです。

  1. AngularJS SPA
  2. nginxの暴露HTTPリクエストローカルjettty/Springアプリケーションへ
  3. APIとしてHTTPS AJAX要求を転送するために、静的なWebコンテンツを提供し、リバースプロキシとしてしますshiroライブラリを使用して春のアプリケーションの一部として保護されています

一般

Request URL:https://domainName.com/api/path 
Request Method:OPTIONS 
Status Code:401 

リクエストヘッダ

:authority:domainName.com 
:method:OPTIONS 
:path:/api/path 
:scheme:https 
accept:*/* 
accept-encoding:gzip, deflate, sdch, br 
accept-language:en-US,en;q=0.8 
access-control-request-headers:accept, authorization, content-type 
access-control-request-method:POST 
origin:https://www.domainName.com 

レスポンスヘッダ:

content-length:0 
date:Tue, 12 Jul 2016 
server:nginx 
status:401 
www-authenticate:BASIC realm="application" 

CORSエラーのための任意のアイデア?

答えて

0

これは、OPTIONSはクロムが行うことを要求する前の飛行OPに基本的です。時には迷惑になるかもしれません。 CORSの代替手段であるXdomainというライブラリを使うのが良いでしょう。また、Angular JSラッパーもあります。これは本当にこのような問題のためのエレガントなソリューションです。見てくださいhttps://github.com/jpillora/xdomain。それがあなたを助けたら私に教えてください:)。

+0

感謝!最終的に私はバックエンドサーバーのcorsフィルタソリューションに移行しました –

0

は最後に、私はそれがクロスオリジンフィルターの設定クラスで桟橋サーバを提供することにより、バックエンド側に固定されました。以下のいくつかのサンプルコード:あなたの答えのための

DispatcherServlet dS = new DispatcherServlet(); 
dS.setContextClass(AnnotationConfigWebApplicationContext.class); 
dS.setContextConfigLocation(String.format("%s",ApplicationConfig.class.getCanonicalName())); 


final ServletHolder servletHolder = new ServletHolder(dS); 
final ServletContextHandler context = new ServletContextHandler(); 
context.setContextPath("/"); 
context.addServlet(servletHolder, "/"); 

// cors 
{ 

FilterHolder h = new FilterHolder(CrossOriginFilter.class); 
h.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM,"https://*.domainName"); 
h.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM,"GET,POST,HEAD,OPTIONS"); 
h.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM,"*"); 
h.setInitParameter(CrossOriginFilter.PREFLIGHT_MAX_AGE_PARAM,"300"); 
h.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM,"true"); 
h.setInitParameter(CrossOriginFilter.EXPOSED_HEADERS_PARAM,""); 
h.setInitParameter(CrossOriginFilter.CHAIN_PREFLIGHT_PARAM,"false"); 
h.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM,"https://*.domainName"); 
context.addFilter(h,"/*",EnumSet.of(DispatcherType.REQUEST)); 

} 
関連する問題