在PhoneGap/Cordova中处理Cookie
我正在开发一个使用服务器会话的PhoneGap应用程序。它需要cookies来处理会话。此外,还应处理来自负载平衡器的cookie。所以没有办法了。你如何处理PhoneGap应用程序中的Cookie 我已经完成了一些研究:在PhoneGap/Cordova中处理Cookie,cordova,cookies,xmlhttprequest,Cordova,Cookies,Xmlhttprequest,我正在开发一个使用服务器会话的PhoneGap应用程序。它需要cookies来处理会话。此外,还应处理来自负载平衡器的cookie。所以没有办法了。你如何处理PhoneGap应用程序中的Cookie 我已经完成了一些研究: 有人说cookie处理可能取决于服务器没有为未知用户代理(IIS)设置cookie: 在JavaScript中,可以使用document.cookie=…,设置cookie,但它们不会保存在PhoneGap中,并且会丢失。在触发xhr请求之前,它会工作 可以在xhr请求后使
- 有人说cookie处理可能取决于服务器没有为未知用户代理(IIS)设置cookie:
- 在JavaScript中,可以使用document.cookie=…,设置cookie,但它们不会保存在PhoneGap中,并且会丢失。在触发xhr请求之前,它会工作
- 可以在xhr请求后使用xhr.getResponseHeader('Set-Cookie')检索Cookie。但只有在服务器上实际设置时。不幸的是,jQuery去掉了“Cookie”头
- JavaScript document.cookie属性在(xhr)请求后未分配和更新
- 有些人建议使用localStorage保存会话ID等,但所有脚本都可以访问它,这可能是XSS安全问题。Cookie通过使用httponly标志来解决此问题
- iOS:有一些修改将改变webView行为以支持Cookie。但它们似乎不适用于iOS 6和PhoneGap 2.5:
- Cookie似乎在AppDelegate.m(v2.5)中默认启用
- 朋友,我也尝试过在phonegap中使用cookies,但没有成功。解决方案是使用本地存储
关键快速示例:
var keyName = window.localStorage.key(0);
window.localStorage.setItem("key", "value");
window.localStorage.removeItem("key");
window.localStorage.clear();
设置项目快速示例:
var keyName = window.localStorage.key(0);
window.localStorage.setItem("key", "value");
window.localStorage.removeItem("key");
window.localStorage.clear();
获取项目快速示例
var value = window.localStorage.getItem("key");
// value is now equal to "value"
删除项目快速示例:
var keyName = window.localStorage.key(0);
window.localStorage.setItem("key", "value");
window.localStorage.removeItem("key");
window.localStorage.clear();
清晰的快速示例:
var keyName = window.localStorage.key(0);
window.localStorage.setItem("key", "value");
window.localStorage.removeItem("key");
window.localStorage.clear();
如果您将javascript用于移动和web,则可以使用以下代码检测该环境:
var wl = window.location.href;
var mob = (wl.indexOf("android")>0);
参考资料:
请注意:在iOS上使用匿名导航可能会使localstorage无法像spected那样工作。一个简单的测试对我来说很好:
$(document).ready(function () {
try {
localStorage.setItem('test', '1');
} catch (Err) {
if (Err.message.indexOf('QuotaExceededError') > -1) {
// Tell the user they are in anonymous mode
// Sugest it to go to https://support.apple.com/pt-br/HT203036 to get help to disable it
}
}
}
});
您还可以将会话id附加到请求url,具体取决于服务器应用程序语言,使用您传递的查询字符串会话id值获取会话数据-例如,在PHP中,您可以通过传递会话id打开现有会话。虽然由于会话劫持风险,不建议这样做,但您可以轻松测试IP和浏览器,以确保会话来自同一客户端。这当然需要在客户端关闭会话浏览器后立即终止会话,并限制您缓存视图,因为会话将包含在实际的html中。至少对我来说,在本地设备上存储数据并不是一个真正的选择,因为它向客户端暴露了太多信息,这在我看来是一个更大的安全风险。使用
设备\u id
来处理服务器端的某些记录。在服务器上创建一个名为session
的数据库表,其中device\u id
、cookiename
、cookievalue
和timestamp
作为列
当客户端通过phonegap应用程序访问您的web服务器时,获取他的设备id
,并将cookie存储在您的表中。此处的设备\u id
充当OAuth协议中的访问令牌
现在,出于安全原因,您需要缩短这些记录的有效期,因为设备id是永久的,您的客户希望有一天出售他们的手机。因此,使用
timestamp
存储客户端的最后一次访问,如果没有访问记录,则删除该记录,比如说10天。与您类似,我希望在我的应用程序中使用服务器设置的cookie,以便我的应用程序与web保持一致,而不需要单独的设备ID或其他身份验证方法
我发现的是:
- 通过AJAX设置的Cookie(例如jQuery
或$.get()
)不会持久存在$.post()
- “inAppBrowser”中设置的Cookie不会持续存在
class PersistCookieHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
token = self.get_argument('token')
self.set_secure_cookie('token',token)
然后,在你的应用程序中:
function persistToken(token,success_cb, error_cb) {
// replace with your URL
url = 'SECURE_SERVER_URL_THAT_HANDLES_SET_COOKIE';
// _blank tells inAppBrowser to load in background (e.g., invisible)
var ref = window.open(url, '_blank', 'location=no,toolbar=no');
// attach a listener to the window which closes it when complete
ref.addEventListener('loadstop', function(event) {
ref.close();
success_cb(); // call our success callback
});
// attach a listener for server errors
ref.addEventListener('loaderror', function(event) {
// call our error callback
error_cb(event);
});
}
然后,您可以按如下方式调用它:
persistToken(
someToken,
function() {
console.log("token persisted");
},
function() {
console.log("something went wrong);
}
);
我正在使用Cordova 6.1(目前最新版本),实际上我发现了以下内容:
如果我通过Javascript使用document.cookie=。。。那么它就不起作用了。但是,如果我通过Ajax向服务器发送一个函数setCookie,函数如下
function setCookie(name, value, exdays) {
if(isPhonegap() === true){
var data = "typ=function&functionType=setCookie&name="+name+"&value="+value+"&exdays="+exdays;
loadAjax(data, false);
}
else if (!(document.cookie.indexOf("name") >= 0)){
var expires;
if (exdays) {
var date = new Date();
date.setTime(date.getTime()+(exdays*24*60*60*1000));
expires = "; expires="+date.toGMTString();
}
else{
expires = "";
}
document.cookie = name+"="+value+expires+"; path=/";
}
}
并在服务器端使用
setcookie($cookie, $value, $expires , "/" );
那它真的起作用了
希望这有帮助。
Cheers也有同样的问题,决定将evrth迁移到localStorage 我写了插件,所以你也可以使用它:当然可以 ionic应用程序只发送一个ajax请求,cookie是否工作良好取决于服务器 我使用过python Django服务器和节点服务器,这两种cookie都工作得很好 节点代码如下
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", '*');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("Access-Control-Allow-Credentials",true);
next();
});
RESTAPI
router.get('/setCookies', function(req, res, next) {
var now = new Date();
var nextYear=new Date(now.setFullYear(now.getFullYear()+1));
//you can change the cookie key and value by your self here
res.cookie('cookiesTest', 'set cookies success,your cookies can be set by server', { expires: nextYear, httpOnly: true });
res.status(200)
res.end('SET COOKIES SUCCESS')
});
router.get('/getCookies', function(req, res, next) {
res.status(200)
res.end(JSON.stringify(req.cookies))
});
爱奥尼亚应用程序代码
var server='http://[YOUR IP HERE]:3000'
$scope.setCookies=function() {
$http({
url: server + '/setCookies',
method: 'GET'
}).success(function (data, header, config, status) {
alert('set cookies success,look console')
$scope.setCookiesStatu=false
console.log(data)
$scope.cookiesValue=data
}).error(function (data, header, config, status) {
alert('set cookies error,check console or your server address is wrong')
console.log(data)
});
}
$scope.getCookies=function() {
$http({
url: server + '/getCookies',
method: 'GET'
}).success(function (data, header, config, status) {
alert('get cookies success,look console')
console.log(data)
$scope.cookiesValue=data
}).error(function (data, header, config, status) {
alert('get cookies error,check console or your server address is wrong')
console.log(data)
});
}
我认为问题基本上在于为cordova应用程序设置客户端cookies。有关此主题的大多数信息表明,设置客户端cookie不适用于cordova 但是我发现了一个插件,它允许我为我的cordova应用程序设置客户端cookies 退房
它只是工作 我还遇到了Cordova+XHR请求的会话cookie问题。每次重新启动应用程序时,Cookie都会丢失。有两件事解决了我的问题:
您还可以通过post XmtHttpRequest发送它,例如在jQuery中使用
$.post()
,然后设置一个局部变量。如果您对所有内容进行加密,这是非常安全的。@JVE999如何对默认情况下由web视图保存的cookie进行加密?所有脚本都可以访问本地存储是什么意思?我认为每个PhoneGap应用程序都是独立的,有点像沙盒。。。没有?这里:也许这个插件有帮助?蒂亚戈,关于你的回答,你能否澄清一下