今天在工作中遇到了乙個問題,就是當使用ajax和jsonp進行跨域時,每一伺服器都會在cookie裡set乙個新的sessionid,會將原有的sessionid覆蓋,也就是說客戶端對於伺服器來說始終處於未登入狀態,我使用谷歌瀏覽器是沒有問題的,但是ie有問題,在ie出問題的原因是瀏覽器中的cookie值在ajax跨域提交時沒有帶過去,就會造成伺服器獲取不到cookie中的sessionid,效果就是伺服器在每次跨域返回值得時候自動建立乙個新的sessionid,知道了原因,下面說說解決方法:
第一種:簡單粗暴型
調整客戶端瀏覽器的internet選項,選擇隱私,設定接受所有cookie
當然這種不適合那種有很多客戶端的場景,總不能每台機器都是手動調吧
第二種: 使用 p3p 規範讓 ie 跨域接受第三方 cookie
瀏覽器的第三方 cookie 限制
所謂第三方 cookie,就是說你訪問網域名稱a下的網頁,卻接收到網域名稱 b 的 cookie 設定指令。這可能是由於網頁 a 請求或鏈結了 b 的網頁,比如上面提到的jsonp。
我查到了各個瀏覽器對於跨域的處理規則,可以看到第三方 cookie ,ie 在預設設定中是做了限制的。
所以要解決這個問題,除了修改瀏覽器設定,就要使用p3p
所以我就在伺服器返回資料時,新增了如下語句
response.setheader("p3p","cp=cao psa our");
搞定!還有一種我沒有試過,但是也是一種解決辦法,在此也記錄一下,這個用的就是json+ajax,使用的標準是cors,即跨域資源共享。
cors是乙個w3c標準,全稱是」跨域資源共享」(cross-origin resource sharing)。
它允許瀏覽器向跨源伺服器,發出xmlhttprequest請求,從而克服了ajax只能同源使用的限制。
cors需要瀏覽器和伺服器同時支援。目前,所有瀏覽器都支援該功能,ie瀏覽器不能低於ie10。
首先我們需要構建乙個***
將指定請求攔截下來後新增header
(1)access-control-allow-origin
該字段是必須的。它的值要麼是請求時origin欄位的值,要麼是乙個*,表示接受任意網域名稱的請求。
(2)access-control-allow-credentials
該欄位可選。它的值是乙個布林值,表示是否允許傳送cookie。預設情況下,cookie不包括在cors請求之中。設為true,即表示伺服器明確許可,cookie可以包含在請求中,一起發給伺服器。這個值也只能設為true,如果伺服器不要瀏覽器傳送cookie,刪除該欄位即可。
(3)access-control-expose-headers
該欄位可選。cors請求時,xmlhttprequest物件的getresponseheader()方法只能拿到6個基本字段:cache-control、content-language、content-type、expires、last-modified、pragma。如果想拿到其他字段,就必須在access-control-expose-headers裡面指定。上面的例子指定,getresponseheader(『foobar』)可以返回foobar欄位的值。
然後在前台js進行修改:
$.ajax({
url:url,
//加上這句話
xhrfields: {
withcredentials: true
crossdomain: true,
success:function(result){
alert(「test」);
error:function(){
這樣我們再跨域測試的時候,就會發現我們的sessionid是一樣的了,這樣就實現了跨域並且保證在同乙個session下。
關於ajax跨域post提交常見錯誤
1,問題出現 在前台頁面使用ajax跨域非同步請求時,瀏覽器console出現 access control allow origin 設定不被允許的提示 2,解決方法 1 首先確定是ajax跨域問題,我們採用filter方式處理,編寫過濾器systemfilter.class public cla...
ajax提交form表單 跨域
有時候我們需要提交form表單,而又不想影響跳轉頁面,同時還不影響瀏覽器的 正常訪問,這個時候就用到了ajax提交 首先,要引入js檔案 var form form serialize ajax 以上就是用ajax提交form表單的操作,後台可以直接接收乙個model 客戶端js 服務端 1 str...
關於ajax跨域問題
本文通過設定 access control allow origin來實現跨域。例如 客戶端的網域名稱是client.w3cschool.cn,而請求的網域名稱是server.w3cschool.cn。如果直接使用ajax訪問,會有以下錯誤 xmlhttprequest cannot load no...