1. 关于 ctx 和前端的关系
在 Koa 中,ctx(Context)是一个封装了请求和响应的对象。它并不是“前端相关的”,而是属于后端的上下文对象。每个 HTTP 请求到达服务器时,Koa 会创建一个 ctx 对象来处理这个请求,并且在请求结束时销毁这个对象。ctx 包含了请求和响应的所有信息,以及一些方便的方法和属性,比如 ctx.request、ctx.response、ctx.session 等等。
当你引入了 Koa 的 koa-session 中间件后,ctx 对象上就会有一个 session 属性。这个属性允许你在后端读取和写入与当前请求相关的会话数据。
2. Session 和 Cookie 的关系
Session:是一种服务器端的状态保持机制。服务器为每个客户端生成一个唯一的 Session ID,并将相关数据存储在服务器端。 Cookie:是浏览器保存的一小段文本信息,每次请求时都会自动发送给服务器。它可以用来存储少量的数据,如用户的偏好设置、认证令牌等。 它们之间的关系: 当你使用 Session 时,通常的做法是:
服务器生成一个唯一的 Session ID,并将其存储在服务器端(可能是内存、文件系统或数据库中)。 同时,服务器会将这个 Session ID 通过 Cookie 返回给客户端。 当客户端再次发起请求时,浏览器会自动带上包含该 Session ID 的 Cookie,这样服务器就能识别出这是同一个用户,并恢复对应的会话数据。 因此,虽然 Session 数据存储在服务器端,但它的标识符(即 Session ID)是通过 Cookie 传递给浏览器并由浏览器自动管理的。
3. 为什么说通过 Cookie 返回给浏览器保存?
当你在 Koa 中使用 koa-session 时,实际上是在做以下几件事:
设置了一个名为 koa.sess(默认配置)的 Cookie。 这个 Cookie 的值包含了 Session ID 或者经过加密后的 Session 数据。 每次客户端发起请求时,浏览器都会自动携带这个 Cookie 发送给服务器。 服务器根据 Cookie 中的 Session ID 来查找对应的会话数据。 示例代码 假设你已经在 Koa 应用中配置了 koa-session:
const Koa = require('koa');
const session = require('koa-session');
const app = new Koa();
// 配置 session
app.keys = ['some secret key'];
const CONFIG = {
key: 'koa.sess', // cookie key (default is koa.sess)
maxAge: 86400000, // cookie 的过期时间 ms
};
app.use(session(CONFIG, app));
app.use(async (ctx) => {
// 如果 ctx.session 中没有 count,则初始化为 0
if (!ctx.session.count) ctx.session.count = 0;
ctx.session.count++;
ctx.body = ctx.session.count;
});
app.listen(3000);
在这个例子中:
每次访问应用时,ctx.session.count 会被递增。 这个计数器的值被保存在服务器端的 Session 中。 但是,为了能够在下次请求时继续增加计数器,你需要通过 Cookie 来记住哪个 Session 属于哪个客户端。
总结 ctx 是后端的概念,用于处理每个 HTTP 请求。 Session 是一种服务器端的状态管理方式,而 Cookie 则是浏览器用来存储少量数据的方式。 Session 依赖于 Cookie 来传输 Session ID,从而实现跨请求的状态保持。