【问题标题】:How to set Cookies in POST Header in AngularJS如何在 AngularJS 的 POST Header 中设置 Cookie
【发布时间】:2017-10-28 08:39:21
【问题描述】:

我正在使用 Web 服务(Drupal 7 服务)通过使用 Ionic 框架的移动应用程序(不是浏览器)进行用户登录/注销。它要求我将 POST 方法的 Header 设置为与用户登录时设置的相同的 cookie。

1)如何使用AngularJS(1.3.5版)获取cookie头

登录时响应头中的cookie是

...
Set-Cookie: SESSd6f3e35b53c92bc6e830d79db4d6eb6c=AEFJYKD8s6vAsizxgYaNOJPy0dPMQ1rJX8RYO-cjfXs; 
...

2) 如何使用 AngularJS 将其放入 $http 标头中

接下来,如何为 POST 设置 Cookie。

$http({
    method    : 'POST',
    url       : '192.168.1.10/app/user/logout',
    dataType  : 'json',
    headers: {
      'X-CSRF-Token': token,
      'Content-Type': 'application/x-www-form-urlencoded',
      'Accept': 'application/json',
      'Cookie': 'SESSd6f3e35b53c92bc6e830d79db4d6eb6c=AEFJYKD8s6vAsizxgYaNOJPy0dPMQ1rJX8RYO-cjfXs, 
      // HOW to set this cookie using angular to the value that was read on login
    },
  })

【问题讨论】:

  • ngCookies 模块提供了一个用于读取和写入浏览器 cookie 的包装器。当您配置$http 标头时,您可以通过其名称获取此cookie 并将其放入标头中。或者使用 http 拦截器在一个地方对所有 http 请求执行此操作。
  • 能否请您展示如何使用ngCookies来读取和写入cookies,特别是如何为http中的Header设置cookie
  • 它在一个单独的模块中定义。我们应该将它作为依赖添加到我们的模块ngCookies。请参阅文档here
  • 当您在网络视图中使用 Angular 时,令牌比 cookie 更可取。查找 Angular 的转换请求并使用它来设置登录成功的 cookie。
  • @Pete 我已将“ngCookies”添加到我的应用程序中。和 $cookies 到我的控制器和功能。我正在寻找的是在登录时读取 cookie 的示例代码。并将 Cookie 放入 $http POST 标头中。你能帮忙提供一个示例代码吗

标签: angularjs cookies ionic-framework drupal service


【解决方案1】:

我看到您使用的是旧版本的 AngularJS (1.3.5)。 在 1.3.5 中,您可以使用 $cookies$cookieStore 服务。 请注意,$cookieStore 自 v1.4.0 起已弃用

在 1.3.5 版本中使用 $cookies

$cookies.cookiename = cookieValue; //sets the cookie
var cookieValue = $cookies.cookiename; //reads the cookie

在 1.3.5 版本中使用 $cookieStore

$cookieStore.put(cookieName, cookieValue); //sets the cookie
var cookieValue = $cookieStore.get(cookieName);//reads the cookie

可以看到$cookies不支持1.3.5版本的方法。更高版本支持它们并且有更多方法,因为 $cookieStore 已弃用。

现在让我们将 cookie 名称设为 phpsessId,它是在您的登录请求后由服务器设置的。在您的控制器中,您可以按如下方式获取其值

var sessionId = $cookieStore.get('phpsessId')

现在http请求可以用这个cookie配置如下

$http({
    method    : 'POST',
    url       : '192.168.1.10/app/user/logout',
    dataType  : 'json',
    headers: {
      'X-CSRF-Token': token,
      'Content-Type': 'application/x-www-form-urlencoded',
      'Accept': 'application/json',
      'Cookie': sessionId
    }
  }).success(function(){...}).error(function(){...});

或者您可以为$http 1.3.5 docs 中提到的所有请求设置通用标头。

还要照顾forbidden header namesCookie 就是其中之一

希望这会有所帮助。

【讨论】:

  • 我使用上述建议取得了进展,但它现在显示“拒绝设置不安全的标头“Cookie””。我使用 Postman - chrome 扩展进行了测试,这需要我使用 Postman Interceptor 才能成功注销。似乎,在 angularJS 中需要类似的东西
  • "Refused to set unsafe header "Cookie" 是来自 Postman 的警告。对吧?如果我们尝试使用 angular 请求呢?
  • 没有。 “拒绝设置不安全的标头“Cookie”'来自 Chrome。但是当我使用 Postman 和 Postman 拦截器时它可以工作。
  • FireFox 抛出:“尝试设置禁止标头被拒绝:Cookie ionic.bundle.js:24947:12”Pete 有什么建议吗?
  • 做了一些研究并从stackoverflow.com/a/42257186/6565719 获得了一些意见。我们不需要指定 cookie 标头。如果我们用 $cookies 设置 cookie,浏览器会在 http 请求中自动添加 cookie
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 2014-10-12
  • 2015-07-21
  • 2012-09-19
  • 2015-03-22
  • 1970-01-01
相关资源
最近更新 更多