【问题标题】:Ionic/Cordova AngularJS getting request header of $httpIonic/Cordova AngularJS 获取 $http 的请求标头
【发布时间】:2016-01-29 21:08:15
【问题描述】:

我想在请求后获取 $http cookie 请求标头,但 $http 仅根据 AngularJS 文档返回响应。这是我想要得到的cookie:

我尝试添加拦截器,但看不到 cookie。这是我的拦截器的输出:

我的拦截器和一些设置:

$provide.factory('myHttpInterceptor', function() {
      return {
        // optional method
        'request': function(config) {
          console.log(config);
          return config;
        }
      };
    });

    $httpProvider.interceptors.push('myHttpInterceptor');

    $httpProvider.defaults.useXDomain = true;
    //Remove text on back button
    $ionicConfigProvider.backButton.previousTitleText(false).text('  ');
    $httpProvider.defaults.withCredentials = true;
    //Setting angularjs' $http to behave as url encoded parameters and request instead of JSON
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';

【问题讨论】:

  • 也试过了,返回 undefined
  • 但是您是否将 ngCookies 包含在您的项目中?
  • 是的,尝试在 http 的成功回调中使用 $cookies.get('JSESSIONID') 但它未定义..
  • __ga 是谷歌分析 cookie...主要意味着服务器正在设置 http-only 标头,这会阻止您获取 cookie

标签: angularjs cookies ionic-framework ionic


【解决方案1】:

您不能在 cordova 应用程序中使用 cookie。 Stackoverflow 中还有很多其他关于该问题的帖子,以及我在this blog 上找到的最新信息,其中的问题是这样描述的:

我真的很喜欢 Cordova 的一切,除了你不能使用基于 cookie 的会话。

在cordova中,您可以访问由html5引入的会话存储和本地存储。

http://www.w3schools.com/html/html5_webstorage.asp 引入例如localstorage 的话:

HTML 本地存储,比 cookie 更好。

http://learn.ionicframework.com/formulas/localstorage/ 有这样的示例代码:

使用这个简单的 AngularJS 服务轻松设置和检索字符串或对象:

angular.module('ionic.utils', [])

.factory('$localstorage', ['$window', function($window) {
  return {
    set: function(key, value) {
      $window.localStorage[key] = value;
    },
    get: function(key, defaultValue) {
      return $window.localStorage[key] || defaultValue;
    },
    setObject: function(key, value) {
      $window.localStorage[key] = JSON.stringify(value);
    },
    getObject: function(key) {
       return JSON.parse($window.localStorage[key] || '{}');
    }
  }
}]);

若要使用此服务,只需将 $localstorage 服务注入控制器或运行函数即可:

angular.module('app', ['ionic', 'ionic.utils'])

.run(function($localstorage) {

  $localstorage.set('name', 'Max');
  console.log($localstorage.get('name'));
  $localstorage.setObject('post', {
    name: 'Thoughts',
    text: 'Today was a good day'
  });

  var post = $localstorage.getObject('post');
  console.log(post);
});

现在,有了这个示例,您可以执行以下操作:

$localstorage.set('sessionId', 'yourSessionIdGoesHere');

阅读

$localstorage.get('sessionId');

【讨论】:

  • 为什么桌面使用chrome,cookies也是未定义的?
  • cookie 是否标记为 httponly(在 cookie 选项卡中的“http”列上打勾)?这意味着 http 协议会处理 cookie,而 javascript 无法访问它。
  • httpOnly 防止恶意使用 cookie,http 协议负责将其发送回服务器,您无需为此烦恼。
  • cookie 不是 httponly,我将 cookie 用于其他目的
【解决方案2】:

如果你不介意我问,你为什么要在客户端读取 JSESSIONID?

我可以想象您希望在每个后续请求中都发送它,但如果您使用 withCredentials = true,这会自动为您完成。

【讨论】:

  • 因为我正在抓取数据,所以当用户成功登录时,我会存储 JSESSIONID。每次请求后,我都会将新的 cookie 与存储的 cookie 进行比较,以检查用户会话是否已过期。我这样做是因为我正在从第三方网站上抓取数据。
  • 好的,所以通常当用户在服务器端注销(会话过期)时,您的请求将被重定向回即登录页面。然后您可以检查是否发生了这种情况并重新登录用户,您的 cookie 将自动更新。
  • 不幸的是,该站点没有将用户重定向到登录页面。最大的问题之一。我尝试执行其他方法,例如检查 HTTP 状态,但它不提供会话过期状态。我最后的赌注是解析整个页面源并检查文档是否包含“会话过期”文本,但这太脏了。
  • 好吧,如果这是检查会话是否已过期的唯一方法,那么就选择该选项。我建议您创建自己的网络抓取服务,因此如果第 3 方更改了他们的会话过期页面,您可以立即更新您的服务,您的用户不必等待应用更新。
  • 我有这个想法。我需要先对其进行测试,因为它有额外的网络负载。
猜你喜欢
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2014-09-25
  • 1970-01-01
  • 2020-10-29
  • 2015-02-18
相关资源
最近更新 更多