在PhoneGap/Cordova中处理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请求后使

我正在开发一个使用服务器会话的PhoneGap应用程序。它需要cookies来处理会话。此外,还应处理来自负载平衡器的cookie。所以没有办法了。你如何处理PhoneGap应用程序中的Cookie

我已经完成了一些研究:

  • 有人说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不会持续存在
      因此,让cookie持久化的方法是使用插件

      首先,设置一个简单的服务器,它接受要持久化的作为GET参数的键值参数。我是python/tornado的家伙,所以我的服务器可能看起来像:

      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都会丢失。有两件事解决了我的问题:

    • Cookie必须有过期日期

    • 所有XHR请求必须将标志设置为true


    • 您还可以通过post XmtHttpRequest发送它,例如在jQuery中使用
      $.post()
      ,然后设置一个局部变量。如果您对所有内容进行加密,这是非常安全的。@JVE999如何对默认情况下由web视图保存的cookie进行加密?所有脚本都可以访问本地存储是什么意思?我认为每个PhoneGap应用程序都是独立的,有点像沙盒。。。没有?这里:也许这个插件有帮助?蒂亚戈,关于你的回答,你能否澄清一下