Koa2 是一个基于 Node.js 的 Web框架,它为开发者提供了许多方便的工具和功能,其中之一就是 Cookie 的处理。Cookie 是一种在客户端存储数据的机制,通常用于跟踪用户信息或存储用户偏好设置等。
Cookie 简单设置和使用
Koa2 提供了非常简单的 API 来设置和获取 Cookie。我们可以通过 ctx.cookies.set()
方法来设置 Cookie,并通过 ctx.cookies.get()
方法来获取 Cookie 的值。例如:
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.cookies.set('username', 'john');
const username = ctx.cookies.get('username');
ctx.body = `Hello, ${username}!`;
});
app.listen(3000);
在上面的例子中,我们先通过 ctx.cookies.set()
设置了一个名为 username
的 Cookie,然后通过 ctx.cookies.get()
获取该 Cookie 的值,并将其插入到响应体中。
Cookie 加配置项的设置和使用
除了简单的设置和获取 Cookie,Koa2 还允许我们对 Cookie 进行更加细致的配置,例如设置 Cookie 的存在时间、过期时间、允许访问的域名、允许访问的路径等等。我们可以通过在 ctx.cookies.set()
方法中传递第三个参数来设置这些配置项。例如:
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.cookies.set('username', 'john', {
domain: 'example.com', // Cookie 域名为 example.com
path: '/admin', // Cookie 路径为 /admin,只能在此路径和子路径下,比如:/admin/user才能使用该cookie
maxAge: 1000 * 60 * 60 * 24, // cookie 存在时间为 1 天
expires: new Date('2023-05-15'), // cookie失效时间,不设置maxAge依照这个计算
secure: true, // Cookie 只能通过 HTTPS 协议传输
httpOnly: true // 是否只用于http请求中获取
overwrite:false // 是否允许重写
});
const username = ctx.cookies.get('username');
ctx.body = `Hello, ${username}!`;
});
app.listen(3000);
在上面的例子中,我们将 Cookie 的过期时间设置为 1 天,域名设置为 example.com,路径设置为 /admin,只能通过 HTTPS 协议进行传输,并且不能被 JavaScript 访问。
需要额外注意的是 cookie的配置项很重要,要么不使用配置项,如果使用了,那就得严格按照配置项去玩,不然会导致cookie设置失败。
Cookie 传中文的情况
当我们需要在 Cookie 中传递中文时,就不能直接写入,需要先转换再写入,转换的方式有很多,这里我介绍两种转换的方式。
第一种是转换成 UTF-8 编码,先将中文字符串转换成 UTF-8 编码,然后再进行设置。例如:
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
const chineseName = '张三';
const encodedName = encodeURIComponent(chineseName);
ctx.cookies.set('name', encodedName);
const name = decodeURIComponent(ctx.cookies.get('name'));
ctx.body = `Hello, ${name}!`;
});
app.listen(3000);
在上面的例子中,我们先将中文字符串 张三
转换成了 UTF-8 编码,然后通过 encodeURIComponent()
方法进行编码。在设置 Cookie 时,我们使用编码后的字符串作为 Cookie 的值。在获取 Cookie 时,我们先通过 ctx.cookies.get()
获取到 Cookie 的值,然后通过 decodeURIComponent()
进行解码,得到原始的中文字符串。
第二种是用Buffer来处理,转换成Buffer文件流
router.get("/cookie", async ctx =>{
ctx.cookies.set("user",new Buffer('你好世界').toString('base64'))
ctx.body = "cookie"
})
let user = new Buffer(ctx.cookies.get("user"), 'base64').toString()
ctx.body = user
总结来说,Koa2 提供了非常方便的 API 来处理 Cookie,在实际开发中可以根据需要进行细致的设置,并且在传递中文时也能够很好地支持。