2014-03-13 154 views
2

AngularJS使用REST對服務器端進行身份驗證,並獲取JSESSIONID cookie。 在下一步中,我試圖從服務器端使用REST以及上一步中獲得的會話cookie獲取一些JSON數據。下面是客戶端代碼:

getSomeJSONDataFromServer:function() { 
var deferred = $q.defer(); 
$http({ 
    method: 'POST', 
    withCredentials: true, 
    url: "http://domain.name/app/someURL", 
    headers:{ 
     'Accept':'application/json', 
     'Content-Type':'application/json; charset=utf-8', 
     'Access-Control-Request-Headers': 'X-Requested-With, content-type, accept, origin, withcredentials' 
    } 
}) 
.success(function(data, status, headers, config) { 
    // handle data 
}) 
.error(function(data, status, headers, config) { 
    // handle error 
}); 
return deferred.promise; 
} 

上面的代碼工作確定:

CORS $http request without body

的問題開始,當我在上面的POST請求體發送一些數據。

... 
$http({ 
    method: 'POST', 
    withCredentials: true, 
    url: "http://domain.name/app/someURL", 
    headers:{ 
     'Accept':'application/json', 
     'Content-Type':'application/json; charset=utf-8', 
     'Access-Control-Request-Headers': 'X-Requested-With, content-type, accept, origin, withcredentials' 
    }, 
    data: '{}' 
}) 
.success(... 

上面的代碼無法在PRELIGHT要求:

CORS $http request with body fails!

貌似服務器,因爲會話cookie是不是出於某種原因開始發送一個新的會話。無論如何,我覺得我錯過了一些非常簡單的東西,一些標題或類似的東西... 任何想法,讚賞。提前致謝。

+0

這似乎是跨域調用的問題。如果您所調用的網址與您的調用腳本位於同一個域中,則AJAX調用僅發送Cookie。 –

+1

是的,絕對是一個CORS電話。它的作品,直到你添加正文請求... –

回答

2

根據Cross-Origin Request with Preflight specs憑證(即會話cookie)不會在預檢請求中發送,因此解決方案是禁用REST服務器端上的OPTIONS請求的安全性,並允許沒有會話cookie的請求僅用於OPTIONS請求。

當然要小心不要禁用POST和GET請求的安全性。

0

根據https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

爲了讓在POST餅乾,需要配置與訪問控制允許的憑據遠程:真。

如果您正在使用的碼頭,你需要配置

<init-param> 
     <param-name>allowCredentials</param-name> 
     <param-value>true</param-value> 
    </init-param> 
從MDN文章

和報價,

重要提示:響應一個資格的請求時,服務器必須指定域,不能使用百搭梳理。如果標題的通配符如下,則上述示例將失敗:Access-Control-Allow-Origin:*。由於Access-Control-Allow-Origin明確提及http://foo.example,因此憑據認證內容將返回到調用Web內容。

7

阿米爾,

讓我來幫助你和其他人清楚地瞭解什麼是有望與CORS打交道時,因爲這樣的:

指數:

  • 簡單CORS版本
  • 預檢CORS版本
  • 憑證申請

簡單CORS版本

  1. 您可以使用GET,HEAD或POST:
    • 在任何方法的情況下,你CAN NOT設置自定義頁眉
    • 您可以始終讓服務器端通過Access-Control-Allow-Origin標頭限制域訪問。
  2. 如果POST有請求數據:
    • 內容類型必須是以下各項中的任一:
      • 應用程序/ x-WWW窗體-urlencoded
      • 的multipart/form-data的
      • text/html的

這個簡單的版本顯然不是你的情況...

預檢CORS版本

  1. 您可以使用GET,HEAD或POST:
    • 在任何方法情況下,您可以使用CAN set 自定義標題
    • 您可以始終讓服務器端通過Access-Control-Allow-Origin標頭限制域訪問。
  2. 如果POST有請求數據:
    • 內容類型可以是以下各項中的
      • 應用程序/ x-WWW窗體-urlencoded
      • 的multipart/form-data的
      • text/html
    • Content-Type 還可以
      • 應用/ JSON
      • 應用程序/ XML
      • 文本/ XML

此預檢版本顯然是:其他類型的你的情況...

請求與憑據

  1. 如果你調用與餅乾電話,你需要設置你的要求的下列參數部分:
    • withCredentials =真

請與證書顯然是你的情況,以及...