問題的產生
- 流程是這樣的,要做一個用戶登錄的接口。在登錄頁面,前端先請求驗證碼,然后輸入用戶名密碼和驗證碼之后,請求登錄接口。
- 這里存在兩個接口,驗證碼接口和登錄接口。在驗證碼接口中我用session保存驗證碼,在登錄接口中我從session取出驗證碼進行校驗。
解決問題
其實最后就做了兩件事情,
1. 服務端設置可以接收cookie信息 -
-
.AllowCredentials();
在ajax請求中設置發送cookie信息
-
$.ajax({ url: a_cross_domain_url, xhrFields: { withCredentials: true } });
非跨域情況下,這個參數無效
-
因為在默認情況下,跨源請求不提供憑據(cookie、HTTP認證及客戶端SSL證明等)。通過將withCredentials屬性設置為true,可以指定某個請求應該發送憑據。如果服務器接收帶憑據的請求,會用下面的HTTP頭部來響應。
雖然設置了widthCredentials為true的請求中會包含遠程域的所有cookie,但這些cookie仍然遵循同源策略,所以外域是訪問不了這些cookie的,現在我們就可以安全地跨域訪問啦。
- 先解釋一下
跨域:
瀏覽器對於javascript的同源策略的限制,例如a.cn下面的js不能調用b.cn中的js,對象或數據(因為a.cn和b.cn是不同域),所以跨域就出現了.
同域的概念又是什么呢???
- 簡單的解釋就是相同域名,端口相同,協議相同
同源策略:
請求的url地址,必須與瀏覽器上的url地址處於同域上,也就是域名,端口,協議相同.
比如:我在本地上的域名是study.cn,請求另外一個域名一段數據
這個時候在瀏覽器上會報錯:
這個就是同源策略的保護,如果瀏覽器對javascript沒有同源策略的保護,那么一些重要的機密網站將會很危險~
study.cn/json/jsonp/jsonp.html | ||
請求地址 | 形式 | 結果 |
http://study.cn/test/a.html | 同一域名,不同文件夾 | 成功 |
http://study.cn/json/jsonp/jsonp.html | 同一域名,統一文件夾 | 成功 |
http://a.study.cn/json/jsonp/jsonp.html | 不同域名,文件路徑相同 | 失敗 |
http://study.cn:8080/json/jsonp/jsonp.html | 同一域名,不同端口 | 失敗 |
https://study.cn/json/jsonp/jsonp.html | 同一域名,不同協議 | 失敗 |
- 測試:在session未賦值之前,sessionid是不固定的,每次請求都會刷新新的ID,未設置withCredentials,每次刷新sessionid都是新的,賦值也取不到值。
- 設置了withCredentials后,session賦值,sessionid就固定了。
- (自我理解就是設置withCredentials跨域后,操作sessionid是操作另一域的session 了 未賦值是sessionid是不固定的,只要賦值就固定了·)