【问题标题】:Is ExpressJS using invalid set-cookie headers?ExpressJS 是否使用了无效的 set-cookie 标头?
【发布时间】:2012-10-09 04:50:15
【问题描述】:

我正在使用 ExpressJS res.cookie 函数将 cookie 添加到标头 res.cookie('mycookie', x, y);

但是深入研究 ExpressJS 和 Connect,我发现用于将 cookie 函数的参数串在一起的连接没有附加分号

express/res.js

res.cookie = function(name, val, options){
  options = options || {};
  if ('maxAge' in options) options.expires = new Date(Date.now() + options.maxAge);
  if (undefined === options.path) options.path = this.app.set('basepath');
  var cookie = utils.serializeCookie(name, val, options);
  this.header('Set-Cookie', cookie);
};

连接/utils.js

exports.serializeCookie = function(name, val, obj){
  var pairs = [name + '=' + encodeURIComponent(val)]
    , obj = obj || {};

  if (obj.domain) pairs.push('domain=' + obj.domain);
  if (obj.path) pairs.push('path=' + obj.path);
  if (obj.expires) pairs.push('expires=' + obj.expires.toUTCString());
  if (obj.httpOnly) pairs.push('httpOnly');
  if (obj.secure) pairs.push('secure');
  //this doesnt append semi colon
  return pairs.join('; ');
};

然后我查找了 Set-Cookie 标头的规范 (http://www.ietf.org/rfc/rfc2109.txt)

Set-Cookie 响应头的语法是

   set-cookie      =       "Set-Cookie:" cookies
   cookies         =       1#cookie
   cookie          =       NAME "=" VALUE *(";" cookie-av)
   NAME            =       attr
   VALUE           =       value
   cookie-av       =       "Comment" "=" value
                   |       "Domain" "=" value
                   |       "Max-Age" "=" value
                   |       "Path" "=" value
                   |       "Secure"
                   |       "Version" "=" 1*DIGIT

语言结构似乎暗示应该有一个分号。

我只是想澄清这一点,因为我针对我使用 res.cookie() 设置的 cookie 运行的一些解析器正在返回“无效的 Set-Cookie 标头”错误。

ExpressJS 是否通过 Connect.js 设置了无效的 Set-Cookie 标头?

【问题讨论】:

    标签: node.js http-headers express connect


    【解决方案1】:

    仅当存在其他属性值对时才需要尾随半色。符号“*(";" cookie-av)”表示出现零次或多次 → 只有cookie-av 的每个附加值才需要分号。

    来自规范:

    非正式地,Set-Cookie 响应标头包含令牌 Set-Cookie:,后跟一个或多个逗号分隔的列表 饼干。每个 cookie 都以 NAME=VALUE 对开头,后跟零 或更多分号分隔的属性值对。的语法 属性值对已在前面展示过。

    严格来说,不符合规范的是在每个分号后通过 express 插入的额外空格。尽管每个理智的浏览器都知道如何处理非标准的额外空格,但我非常有信心。

    【讨论】:

    • 啊,所以是空格。问题不在于浏览器,它是 Java 中的其他解析器库。 -_-
    • 不,第三方审核员,我不知道他们在使用什么。我只需要在我们这边解决这个问题。
    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 2019-06-10
    • 2020-09-06
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多