2014-09-18 47 views
0

我嘗試訪問Rest服務,該服務通過ajax調用託管在我的不同域中,並且在螢火蟲中出現「CORS」錯誤。即使在服務中添加Access-Control-Allow-Origin後,CORS也無法修復

在研究了這個問題後,我發現需要通過在響應頭中添加Access-Control-Allow-Origin來*來改變服務。我在服務中也這樣做了。

 public Response search(String expression) { 

     return Response.ok() //200 
      .entity(ConnectionUtils.query(expression)) 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT") 
      .header("Access-Control-Allow-Headers", "Content-Type,Accept") 
      .allow("OPTIONS").build(); 

    } 

上述方法實現類的以下服務接口:

 @POST 
    @Path("/search") 
    public Response search(String expression); 

我試圖通過先進的鉻其餘客戶端發佈到這個URL的請求,我得到的響應爲好。此外,響應標頭還顯示Access-Control-Allow-Origin也已正確設置。請參考下面的Chrome用戶端的截圖:

enter image description here

如果你看到上面的響應頭已經被改變。

但我下面的Ajax調用總是返回CORS錯誤:

" Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://192.168.1.100:8080/cqs-1.0-SNAPSHOT/services/services/cqs/search. This can be fixed by moving the resource to the same domain or enabling CORS." 

    $.ajax({ 
     type: 'POST', 
     url: "http://192.168.1.100:8080/cqs-1.0-SNAPSHOT/services/services/cqs/search", 
     crossDomain: true, 
     dataType: 'json', 
     data: {"offer.offer.offerId.USSellerId": {$gt: 0}}, 
     headers: { 
      "Accept": "application/json", 
      contentType: "application/json" 
     }, 
     success: function (data) { 
      console.log(data); 
     }, 
     error: function (data) { 
      console.log(data.statusText); 
      console.log(data.name); 
     } 
    }); 

回答

1

不要使用CORS。它充滿了危險。相反,使用Apache(或類似的)在服務器上設置一個簡單的反向代理。一旦設置完畢,您的應用的所有請求都可以返回到您的域/端口,因此不會從瀏覽器觸發任何OPTION方法。同時,您的反向代理可以根據url中的路徑重定向請求,這完全取決於您想要如何配置。

就我而言,我只是有一個簡單的情況需要訪問同一臺服務器上的兩個不同的端口。端口8080(tomcat)正在服務我的GWT UI,並且來自我的GWT頁面(使用RestyGWT)的REST請求需要達到端口9000(Play框架端口)。由於端口不同,CORS需要處理瀏覽器正在執行的OPTION'預檢'檢查。

要解決這個問題,我只需將我的URL設置爲具有/ ui路徑或/ api路徑。 因爲域/端口是相同的,我的代理可以很容易地重定向到正確的端口(api - > 9000和ui - > 8080),因此不再需要CORS。

CORS在我的經驗中有很多問題,包括cookies。使用反向代理來避免它真的更好。

如果您需要更多的細節,我可以發佈更多 - 讓我知道。

JR

相關問題