2016-07-12 23 views
1

我沒有看到自己製作了跨域AJAX請求。不過,我仍然收到CROSS相關的錯誤。這僅在Chrome上發生。 Firefox和Safari工作正常。Chrome上的CORS錯誤

錯誤: 「響應到預檢要求不經過訪問控制檢查:否‘訪問控制允許來源’標題存在於所請求的資源」。

的設置是:

  1. AngularJS SPA
  2. Nginx的提供靜態網頁內容和作爲反向代理轉發HTTPS AJAX請求作爲HTTP請求發送到本地jettty /彈簧應用
  3. API公開作爲春季應用的一部分使用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

這主要是由於Chrome製作的預購航班OP選項要求。有時候可能很煩人。最好使用一個名爲Xdomain的庫,它是CORS的替代品。它也有Angular JS包裝。這對於這樣的問題來說確實是一個很好的解決方案看看https://github.com/jpillora/xdomain。讓我知道如果這有助於你:)。

+0

感謝您的回答!最終我轉移到了後端服務器cors過濾器解決方案 –

0

最後,我通過爲Jetty服務器提供Cross Origin Filter配置類來修復後端。一些示例代碼如下:

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)); 

}