html5手機開發cookie的用法總結

首先,如果不跨域,發送Ajax請求,例如:

$( "#btn_login" ).on( "click", function( event ) {      

      $.ajax({

           type: "POST",

           url: serverURL + '/user',

           dataType: 'json',

           dataType : 'jsonp',

           data: { 'nickname': nickname, 'password': password, 'action': 'login' },

           error: function(xhr, ajaxOptions, thrownError){

             //alert(xhr.status);                

           },

           success: function(xml, status, jqxhr) {

             if('true' == xml.issuccessful){//登錄成功                  

                 alert(document.cookie);

                 $('#rtnInfo').html("登錄已成功,正在跳轉...");

                 $("#bkbutton").trigger("click");

             }else{//登錄失敗

                 $('#rtnInfo').html(xml.reason);

             }            

           }

       });

   });

服務器Java通過Response寫一個cookie:

   Cookie cookie = new Cookie(cookieName,"");

   cookie.setDomain("your.server.domain");

   cookie.setPath("/");

   cookie.setMaxAge(10000);

   response.addCookie(cookie);

那麼alert(document.cookie)結果是:


但是如果使用Intel XDK 的Emulate,同樣的代碼,獲取到的結果如下:


然後如果用Intel XDK 的Test,或者用Cordova封裝到手機上進行測試,結果如下:


那說明在手機上 document.cookie訪問不到Ajax請求獲得的返回的帶域名的cookie的。

那麼是不是可以通過getResponseHeader獲得呢?


success: function(xml, status, jqxhr) {

  console.log(jqxhr.getResponseHeader("Set-Cookie"));

});

我們通過:

http://stackoverflow.com/questions/14362830/cookies-not-sent-in-ajax-request-headers-when-doing-xss-with-cors-access-contro

知道,也是獲取不到的。

那通過Jquery的cookie插件是否可以呢?

我們通過引入http://plugins.jquery.com/cookie/插件:

<script type="application/javascript" src="vendor/jquery.cookie.js" ></script>

發現,通過:
$.cookie('go*****')

也是獲取不到?

那麼我們的問題來了,html5做手機開發,怎樣使用cookie是最佳實踐?

我的理解有兩個方法:

第一個方法,app中不用傳統的cookie處理,改用html5的localstorage,可以參考:

http://stackoverflow.com/questions/18976319/cordova-on-android-getresponseheaderset-cookie-returns-only-the-last-cookie

即:

服務端json數據傳回cookie的值,然後存在 local storage中:

window.localStorage.setItem("Cookies", data);

在以後的發送Ajax請求都使用:

beforeSend:setHeader

function setHeader(xhr){    xhr.setRequestHeader('Set-Cookie', window.localStorage.getItem("Cookies"));}

第2個辦法,我們發現雖然通過js獲取不到服務端傳回的cookie,但是實際上app的運行時是獲取到了的,在以後的請求中實際上是發送了以前傳回來的cookie的,故,乾脆在js中什麼都不幹。只是有一個問題,是app中刪除不了這個cookie,用戶退出登錄時,再次讓服務器設置cookie爲過期。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章