首先,如果不跨域,發送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"));
});
我們通過:
知道,也是獲取不到的。
那通過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,可以參考:
即:
服務端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爲過期。