为什么AngularJS将X-XSRF-TOKEN标头作为JSON字符串发送?

时间:2013-05-17 13:31:03

标签: angularjs angular-http angular-cookies

Angular sets the X-XSRF-TOKEN header to the value of the XSRF-TOKEN cookie:

var xsrfValue = isSameDomain(config.url, $browser.url())
                ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]
                : undefined;
if (xsrfValue) {
  headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;
}

但是,如果使用XSRF-TOKEN设置$cookieStore cookie(例如,对于Rails集成):

$cookieStore.put("XSRF-TOKEN", "my_token"); 

the cookie is stored as JSON string:

put: function(key, value) {
  $cookies[key] = angular.toJson(value);
}

这意味着标题将包含额外的双引号:

X-XSRF-TOKEN    "my_token"

为什么Angular在设置标头的值时不会调用fromJson(),因此标题将如下所示:

X-XSRF-TOKEN    my_token

这样可以避免我们删除服务器端的额外双引号。

我错过了一些明显的东西吗?

注意:我不是在寻找解决方法。我试图了解这种行为是否是预期的行为,如果是,那么理由是什么?

1 个答案:

答案 0 :(得分:8)

Here is the official answer I got:

  

这里真正的问题是你正在尝试使用$ cookieStore   出于错误的目的。 $ cookieStore是一个抽象的顶部   $ cookie,它与对象一起使用并将它们序列化为JSON。如果你   想要分配XSRF令牌,然后只需使用$ cookie来编写它   直接使用字符串。

换句话说,应该做:

$cookies["XSRF-TOKEN"] = "my_token"; // Stored as: my_token

而不是:

$cookieStore.put("XSRF-TOKEN", "my_token"); // Stored as: "my_token"