解决的问题:
因为http是无状态的,所以服务器不知道是哪个客户端在请求服务。koa-session 通过生成不同的cookie到浏览器端,后续请求的请求头会携带这些cookie信息,来实现识别客户端。常用于登陆模块。
案例:
const Koa = require('koa');
const Session = require('koa-session');
/**
* 用于配合signed属性的签名
* */
const session_signed_key = ['some secret key'];
const session_config = {
key:'cookiename', // cookie的key
maxAge: 8640000, // cookie 有效时长
autoCommit: true, //自动提交的相应头,默认是true
overwrite: true, // 是否允许重写,默认是true
httpOnly: true, // 只允许http服务请求,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。 (默认 true)
siged: true,//** 是否签名。(默认是 true) */
rolling: true, //** 是否每次相应刷新session的有效期,默认为false
renew: false, //是否在session快过期的时候刷新session的有效期,默认为false
}
const App = new Koa();
const session = Session(session_config,App);
App.keys = session_signed_key;
App.use(session);
App.use(ctx =>{
const databaseUserName = 'testname';
const databaseUserPasswd = 'testpw';
if(ctx.path === '/favicon.ico'){return};
console.log(ctx.session.logged)
if(!ctx.session.logged){
ctx.session.logged = false;
let query = ctx.request.query;
if(query.username && query.passwd){
if(query.username === databaseUserName){
if(query.passwd === databaseUserPasswd){
ctx.body = '登陆成功';
ctx.session.logged = true;
}else{
ctx.body = '密码错误'
}
}else{
ctx.body = "该用户不存在"
}
}else{
ctx.body = '用户名或密码不存在'
}
}else{
ctx.body = "已登陆"
}
})
App.listen(3000);
console.log("Koa运行在:http://127.0.0.1:3000");
我们第一次访问 http://localhost:3000 ====> 返回 '用户名或密码不存在'
我们输入错误的账号密码: http://localhost:3000/?username=errorname&passwd=errorpw ===》 ‘该用户不存在‘
我们输入正确的账号密码:http://localhost:3000/?username=testname&passwd=testpw ====》 ‘登陆成功’
我们第二次访问: http://localhost:3000 =====> 返回‘已登陆’,识别到客户端