📅  最后修改于: 2023-12-03 14:42:00.414000             🧑  作者: Mango
HTTP 协议允许通过发送头信息(header)来告知服务器请求的一些附加信息,包括设置 Cookie。HTTP/1.1 引入了 Cookie2 这个版本用于增加 cookie 的功能,使得 cookie 更加灵活和可靠。Cookie2 主要通过设置标头来实现。
Set-Cookie2 标头用于设置一个 cookie,在 HTTP/1.1 中,不仅可以使用 Set-Cookie,还可以使用 Set-Cookie2。它的语法如下:
Set-Cookie2: NAME[=VALUE]; [OPTION...]
其中,NAME
代表 cookie 的名称,VALUE
代表 cookie 的值,OPTION
代表 cookie 的选项,多个选项之间使用分号进行分隔。常见的选项包括:
例如,设置一个名称为 session
,值为 123456
,过期时间为一小时后,允许在 example.com/test
路径下进行访问的 cookie:
Set-Cookie2: session=123456; Max-Age=3600; Domain=example.com; Path=/test
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,从而实现了用户身份认证。