夫天地者,万物之逆旅;光阴者,百代之过客。而浮生若梦,为欢几何?
Node.js中koa框架二:cookie、session

前言

cookie 是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域名的时候共享数据。

session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而session 保存在服务器上。

koa cookie的使用

koa中可以直接设置和获取cookie的值,不需要安装第三方中间件,具体方法如下:

ctx.cookies.set(name, value, [options]); //设置cookie
ctx.cookies.get('name');//获取cookie

接下来我们通过代码来演示使用的方式:

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();
router.get('/',async(ctx)=>{
    //设置cookie
    ctx.cookies.set('UserInfo','damon_18',{
        maxAge:60*1000*60 //设置过期时间
    });
    ctx.body="首页";
});
router.get('/list',async (ctx)=>{
    var UserInfo=ctx.cookies.get('UserInfo');
    console.log(UserInfo);
    ctx.body='列表页面'+UserInfo;
});
app.use(router.routes()); //作用:启动路由
app.use(router.allowedMethods());
app.listen(8081);

通过这段代码我们就能设置和获取cookie的值了

但是到这里我们发现,如果将cookie的值设置为中文的话,直接运行程序是会报如下的错误:

这个问题应该是koa-cookie中不支持直接设置中文,因此我们需要通过其他方式来转换,具体如下:

new Buffer('一蓑烟雨').toString('base64');// 转换成 base64 字符串
new Buffer('xxxx', 'base64').toString());// 还原 base64 字符串

修改后的代码如下:

router.get('/',async(ctx)=>{
    //设置cookie
    var userInfo=new Buffer('一蓑烟雨').toString('base64');
    ctx.cookies.set('UserInfo',userInfo,{
        maxAge:60*1000*60 //设置过期时间
    });
    ctx.body="首页";
});
router.get('/list',async (ctx)=>{
    var userData=ctx.cookies.get('UserInfo');
    var UserInfo=new Buffer(userData, 'base64').toString();
    console.log(UserInfo);
    ctx.body='列表页面'+UserInfo;
});

执行结果如下:

cookie中的各参数配置如下:

options 名称options 值
maxAge一个数字表示从 Date.now() 得到的毫秒数
expirescookie 过期的 Date
pathcookie 路径, 默认是'/',配置可以访问的页面
domaincookie 域名,默认就是当前域下面的所有页面都可以访问
secure安全 cookie 默认 false,设置成 true 表示只有 https 可以访问
httpOnly是否只是服务器可访问 cookie, 默认是 true

session的使用

koa中使用session时需要先安装,即:

npm install koa-session --save / cnpm install koa-session --save

具体使用如下:

var Koa=require('koa'),
    router = require('koa-router')(),
    session = require('koa-session');
var app=new Koa();
//配置session的中间件
app.keys = ['some secret hurr']; //cookie的签名
const CONFIG = {
    key: 'koa:sess', 
    maxAge: 10000,  
    overwrite: true, 
    httpOnly: true, 
    signed: true, 
    rolling: true, 
    renew: false, 
};
app.use(session(CONFIG, app));
router.get('/',async (ctx)=>{
    //设置session
    ctx.session.UserInfo='一蓑烟雨';
    ctx.body="首页";
})
router.get('/list',async (ctx)=>{
    //获取session
    console.log(ctx.session.UserInfo);
    ctx.body="列表页面";
})

执行结果如下:

session配置中的各参数说明如下:

options 名称options 值
key默认key值
maxAgesession的过期时间,需手动修改
overwrite是否可以重写,默认true,一般不作设置
httpOnlytrue表示只有服务器端可以获取session
signed签名默认 true
rolling在每次请求时强行设置 session,重置 session 过期时间(默认:false)
renew与rolling功能相似,设置绝对过期时间和滑动过期时间

后台登录功能

利用cookie和session就可以来实现后台的登录功能,实现的思路是:在请求所有/admin后台路由之前,进行账号密码的校验,校验成功则放行,校验失败则跳到登录页面。此时我们就需要利用前面讲过的应用级中间件和路由中间件来实现。核心的代码如下:

//配置中间件 校验登录用户的session信息
router.use(async (ctx,next)=>{
    var pathname=url.parse(ctx.request.url).pathname;//获取后台页面路由,如:/admin/login
    //权限判断
    if(ctx.session.UserInfo){
        await  next();
    }else{  
        if(pathname=='/admin/login' || pathname=='/admin/login/doLogin'){
            await  next();
        }else{
            ctx.redirect('/admin/login');//没有登录跳转到登录页面
        }
    }
})
//后台主页
router.get('/',async (ctx)=>{
   ctx.render('admin/index');
})
//登录页面
router.get('/admin/login',async (ctx)=>{
   ctx.render('admin/login');//渲染login页面
})
//提交登录操作
router.post('/admin/doLogin',async (ctx)=>{
     var user={};
   var userName=ctx.request.body.userName;
   var password=ctx.request.body.password;
   user.userName=userName;
   user.password=password;
   //TODO:合法性校验,并与数据库进行账号密码的校验
   if(userName=="admin"&&password=="123"){
           ctx.session.UserInfo=user;
           ctx.redirect('/admin');
   }else{
           ctx.render('admin/error',{
            message:'用户名或密码错误',
            redirect: '/admin/login'
        })
   }
})

至此,koa中的cookie和session基本用法介绍完毕,后续将在项目实际应用。

作者:一蓑烟雨

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

0

支持

0

反对

posted @2020-3-5  拜读(799)

评论列表

评论内容:



喜欢请打赏

支付宝 微信

请放心支付