【问题标题】:Why does express-session create an array for Set-Cookie?为什么 express-session 为 Set-Cookie 创建一个数组?
【发布时间】:2021-10-16 07:50:56
【问题描述】:

express-session源代码中这是做什么的:

function setcookie(res, name, val, secret, options) {
  var signed = 's:' + signature.sign(val, secret);
  var data = cookie.serialize(name, signed, options);

  var prev = res.getHeader('Set-Cookie') || []
  var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];

  res.setHeader('Set-Cookie', header)
}

具体来说:

  var prev = res.getHeader('Set-Cookie') || []
  var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];

什么时候会出现这样的情况:您已经将 cookie 写入响应标头,然后需要将其设为某种数组?这里发生了什么,为什么?

【问题讨论】:

    标签: express session cookies


    【解决方案1】:

    同一响应中可以有多个 Set-Cookie 标头。而且,res.setHeader(name, data) 接受数据数组,以便为​​同一个标头指定多个重复值。

    因此,为了“添加”另一个标头,此代码获取当前标头值(如果有)。如果该值已经是一个数组,那么它只是将新值添加到该数组中。如果它还不是一个数组(例如只有一个值),那么它将现有值和新值放入一个数组中并调用 res.setHeader(name, data) 其中data 现在是一个值数组。

    这是必需的,因为 res.setHeader() 在调用特定名称时不会“添加”该名称的新值 - 而是用该名称替换任何现有值。因此,要添加新值,它必须获取现有值,确保它们在数组中,将新值添加到数组中,然后将新值设置为数组。

    所以,这一行:

    var prev = res.getHeader('Set-Cookie') || []
    

    如果没有现有的“Set-Cookie”标头,则将默认值设为空数组。

    那么,这一行:

    var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];
    

    检查我们刚刚得到的值是否已经是一个数组。如果是这样,它将新值连接到该数组。如果不是(它必须只是单个值),则它将先前的单个值与新值组合到一个数组中。因此,所有代码路径都有一个数组,新值位于数组末尾,任何先前值位于数组开头。然后,它可以使用该数组调用res.setHeader(),并将所有先前的值替换为先前值和任何新值的组合。

    此代码将与以下内容一起使用:

    res.setHeader('Set-Cookie', 'color=blue');
    res.setHeader('Set-Cookie', 'shape=square');
    

    这段代码的结果是Set-Cookie 将有两个值'color=blue''shape=square'。而且,当实际发送响应时,它会构造两个单独的 Set-Cookie 标头,每个标头都有这些值之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 2014-06-27
      • 2023-01-18
      • 2021-02-04
      • 2021-11-08
      • 2020-01-05
      • 1970-01-01
      • 2021-06-15
      相关资源
      最近更新 更多