首先,如果不跨域,发送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/插件:
发现,通过:
$.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为过期。