处理PhoneGap / Cordova中的cookies
我正在使用服务器会话使用PhoneGap应用程序。 它需要cookies来处理会话。 另外,来自负载平衡器的cookie也应该被处理。 所以没有办法。 如何处理PhoneGap应用程序中的Cookies?
我已经完成了一些研究:
- 有人说cookie处理可能取决于服务器没有为未知用户代理(IIS)设置cookie: iOS上的PhoneGap会话(cookie)
- 在JavaScript中,cookie可以用document.cookie = …来设置,但是它们不会保存在PhoneGap中并丢失。 在发射xhr请求之前它工作。
- 使用xhr.getResponseHeader('Set-Cookie')在xhr请求后可以检索cookie。 但只有在服务器上实际设置。 不幸的是,jQuery去掉了“Cookie”头。
- (xhr)请求之后,JavaScript document.cookie属性未被分配,也未更新。
- 有些人build议localStorage保存会话ID等,但所有的脚本都可以访问它,这可能是XSS的安全问题。 Cookies通过使用httponly标志来解决这个问题。
- iOS:有一些修改会改变webView行为来支持cookie。 但他们似乎不适用于iOS 6和PhoneGap 2.5: https ://groups.google.com/forum/ ? fromgroups =#!topic/ phonegap/ZJE1nxX63ow
- Cookie似乎在AppDelegate.m(v2.5)中默认启用。
朋友,我也尝试过,没有成功使用cookie的手机。 解决scheme是使用localStorage。
关键快速示例:
var keyName = window.localStorage.key(0);
设置项目快速示例:
window.localStorage.setItem("key", "value");
获取物品快速示例
var value = window.localStorage.getItem("key"); // value is now equal to "value"
删除项目快速示例:
window.localStorage.removeItem("key");
清除快速示例:
window.localStorage.clear();
如果你使用你的手机和网页的JavaScript,你可以使用这段代码来检测环境:
var wl = window.location.href; var mob = (wl.indexOf("android")>0);
参考文献: http : //docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html#localStorage http://cordova.apache.org/docs/en/6.x/cordova/storage/storage.html #页面TOC源
请注意:在iOS上使用匿名导航可能会使本地存储无法正常工作。 一个简单的testing,对我来说工作正常:
$(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,并根据服务器应用程序语言,使用您传递的查询string会话id值获取会话数据 – 在PHP中,您可以通过传入会话ID来打开现有会话。 虽然由于会话劫持的风险,build议不要这样做,但您可以轻松地testingIP和浏览器,以确保会话来自同一个客户端。 这当然会要求你在客户端closures会话浏览器时立即终止会话,并限制你从caching视图,因为会话将被包含在实际的html中。 至less在本地设备上存储数据不是一个真正的select,因为它暴露给客户太多,在我看来是一个更大的安全风险。
与您类似,我想在我的应用程序中使用由服务器设置的Cookie,以便我的应用程序与networking保持一致,而不需要使用单独的设备ID或其他方法进行身份validation。
我发现的是以下几点:
- 通过AJAX设置的Cookie(例如jQuery
$.get()
或$.post()
)不会持久 - 设置在“inAppBrowser”中的Cookie仍然存在。
从而得到一个cookie坚持的方式是使用inAppBrowser插件。
首先,设置一个简单的服务器,接受你想要保存的GET参数键值参数。 我是一个python/龙卷风的家伙,所以我的服务器可能是这样的:
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 (eg, 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); } );
使用device_id
来解决服务器端的某些logging。 在服务器上创build一个名为session
的数据库表,其中device_id
, cookiename
, cookievalue
和timestamp
为列。
当客户端通过电话应用程序访问您的Web服务器时,获取他的device_id
并将Cookie存储在您的表中。 device_id here
充当OAuth协议中的访问令牌。
现在出于安全原因,您需要减less这些logging的有效期,因为device_id是永久的,而您的客户希望有一天能卖掉手机。 因此,使用timestamp
来存储客户端的最后一次访问,如果logging没有被访问,例如10天,则删除该logging。
我正在使用cordova6.1(目前的最新版本),实际上我发现以下几点:
如果我使用document.cookie = …通过JavaScript设置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=/"; } }
并使用在服务器端设置Cookie
setcookie($cookie, $value, $expires , "/" );
那么它确实工作!
希望这可以帮助。 干杯
有同样的问题,并决定将evget移到localStorage我写了插件,所以你也可以使用它: angular-cookies-mirror
当然可以。
离子app只是发送一个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) }); }
你可以在这里查看我的课程代码