📜  HTTP 标头 |设置-Cookie2(1)

📅  最后修改于: 2023-12-03 14:42:00.414000             🧑  作者: Mango

HTTP 标头 | 设置-Cookie2

简介

HTTP 协议允许通过发送头信息(header)来告知服务器请求的一些附加信息,包括设置 Cookie。HTTP/1.1 引入了 Cookie2 这个版本用于增加 cookie 的功能,使得 cookie 更加灵活和可靠。Cookie2 主要通过设置标头来实现。

Cookie2 标头
Set-Cookie2

Set-Cookie2 标头用于设置一个 cookie,在 HTTP/1.1 中,不仅可以使用 Set-Cookie,还可以使用 Set-Cookie2。它的语法如下:

Set-Cookie2: NAME[=VALUE]; [OPTION...]

其中,NAME 代表 cookie 的名称,VALUE 代表 cookie 的值,OPTION 代表 cookie 的选项,多个选项之间使用分号进行分隔。常见的选项包括:

  • Domain: cookie 可访问的域名
  • Path: cookie 可访问的路径
  • Max-Age: cookie 的最长有效期(单位为秒)
  • Secure: 表示 cookie 只能通过 HTTPS 进行传输

例如,设置一个名称为 session,值为 123456,过期时间为一小时后,允许在 example.com/test 路径下进行访问的 cookie:

Set-Cookie2: session=123456; Max-Age=3600; Domain=example.com; Path=/test
Cookie2

Cookie2 标头用于向服务器发送 cookie,在 HTTP/1.1 中,不仅可以使用 Cookie,还可以使用 Cookie2。它的语法如下:

Cookie2: NAME1=VALUE1; NAME2=VALUE2; ...

其中,NAME 代表 cookie 的名称,VALUE 代表 cookie 的值。多个 cookie 之间使用分号进行分隔。

例如,发送一个名称为 session,值为 123456 的 cookie:

Cookie2: session=123456
示例

下面是一个基于 Node.js 的示例代码,使用 Cookie2 实现用户身份认证:

const http = require('http');

// 模拟服务器存储的用户信息
const users = [
  { id: 1, username: 'user1', password: '123456' },
  { id: 2, username: 'user2', password: '123456' },
];

http.createServer((req, res) => {
  if (req.url === '/login' && req.method === 'POST') {
    let body = '';

    req.on('data', chunk => {
      body += chunk.toString();
    });

    req.on('end', () => {
      const { username, password } = JSON.parse(body);

      const user = users.find(u => u.username === username && u.password === password);

      if (user) {
        res.writeHead(200, {
          'Set-Cookie2': `user_id=${user.id}; Path=/; Max-Age=3600`,
        });

        res.end(JSON.stringify({ success: true }));
      } else {
        res.writeHead(401);
        res.end(JSON.stringify({ success: false, message: '用户名或密码错误' }));
      }
    });
  } else if (req.url === '/user' && req.method === 'GET') {
    const cookie = req.headers.cookie2;

    if (cookie) {
      const userId = cookie.split(';').find(c => c.trim().startsWith('user_id='));

      if (userId) {
        const id = parseInt(userId.trim().substring(8), 10);

        const user = users.find(u => u.id === id);

        if (user) {
          res.writeHead(200, {
            'Content-Type': 'application/json',
          });
          res.end(JSON.stringify(user));
        } else {
          res.writeHead(404);
          res.end();
        }
      } else {
        res.writeHead(401);
        res.end(JSON.stringify({ success: false, message: '未登录' }));
      }
    } else {
      res.writeHead(401);
      res.end(JSON.stringify({ success: false, message: '未登录' }));
    }
  } else {
    res.writeHead(404);
    res.end();
  }
}).listen(3000);

该示例代码创建了一个 Node.js 的 HTTP 服务器,实现了用户的登录和获取用户信息的 API。其中,登录使用了 Cookie2 的 Set-Cookie2 标头来设置用户的唯一标识 user_id,获取用户信息使用了 Cookie2 的 Cookie2 标头来获取用户的唯一标识 user_id,从而实现了用户身份认证。