Koa2学习(八)使用session

koa2框架不提供session的处理方法,这里我们需要借助一个第三方中间件koa-session来处理session。

先安装插件:

$ npm i koa-session

通过注册这个中间件,我们可以直接通过ctx.session来操作session:

const Koa = require('koa')
const app = new Koa()
const session = require('koa-session')
app.keys = ['secret'] // session加密字段
app.use(session({
key: 'koa:sess', //cookie key (default is koa:sess)
maxAge: 86400000, // cookie的过期时间 maxAge in ms (default is 1 days)
overwrite: true, //是否可以overwrite (默认default true)
httpOnly: true, //cookie是否只有服务器端可以访问 httpOnly or not (default true)
signed: true, //签名默认true
rolling: false, //在每次请求时强行设置cookie,这将重置cookie过期时间(默认:false)
renew: false, //(boolean) renew session when session is nearly expired,
}, app))
app.use(ctx => {
// ignore favicon
if (ctx.path === '/favicon.ico') return
console.log(ctx.session)
let n = ctx.session.views || 0
ctx.session.views = ++n
ctx.body = n + ' views'
});
app.listen(8000) module.exports = app
  1. 这个ctx.session是针对某一个浏览器用户的。
  2. 不断地刷新访问浏览器,浏览器上显示的访问次数会增加。
  3. 如果不使用数据库,session是保存在内存中的。在服务端通常会使用redis等方案来使session持久化。

现在我们来模拟一个简单的登陆:

const Koa = require('koa')
const app = new Koa()
const session = require('koa-session')
app.keys = ['secret'] // session加密字段
app.use(session({}, app)) app.use(async (ctx, next) => {
if (ctx.url === '/login') {
ctx.session.user_name = 'zhangsan'
ctx.body = {
msg: '登录成功'
}
}
await next()
})
app.use(async (ctx, next) => {
if (ctx.url === '/logout') {
ctx.session = null
ctx.body = {
msg: '退出成功'
}
}
await next()
})
app.use(async ctx => {
console.log(ctx.session)
if (ctx.url === '/index') {
if (ctx.session.user_name === 'zhangsan') {
ctx.body = {
msg: '成功匹配到用户zhangsan'
}
} else {
ctx.body = {
msg: '登陆验证失败'
}
}
}
})
app.listen(8000) module.exports = app
  1. 当用户登陆到login页面时,session会将zhangsan保存为user_name。

  2. 用户访问index页面时,session会对当前的user_name做匹配,如果匹配成功,则认证登陆成功。

  3. 用户访问logout页面是,session会自我销毁。

  4. 这样再次访问index页面时,登陆就会失败。

最新文章

  1. ASP.NET从MVC5升级到MVC6 RC2 总目录 - 发布在RC2Release之后
  2. Android 判断SIM卡属于哪个移动运营商
  3. Es6 学习笔记
  4. Activity有四种加载模式(转)
  5. OpenGL es3.0 初始化及渲染
  6. 【转】【C#】在 Windows 窗体 DataGridView 单元格中承载控件
  7. 【POJ】2954 Triangle(pick定理)
  8. 移动端Web页面问题
  9. POJ 3181 Dollar Dayz(高精度 动态规划)
  10. bzoj2337
  11. iOS7支持九宫格
  12. Jsoup API解析HTML中input标签
  13. jqGrid Demos
  14. shell脚本语法学习
  15. tomcat 、NIO、netty 本质
  16. 30.深入理解abstract class和interface
  17. 排错-SP2-1503:无法初始化Oracle调用界面解决
  18. 在vultr中安装coreos
  19. 最简单的css实现页面宽度自适应
  20. Codeforces gym101955 A【树形dp】

热门文章

  1. vue 项目部署
  2. LeetCode(21)Merge Two Sorted Lists
  3. scrollLeft属性设置无效的一个记录
  4. Cannot delete or update a parent row: a foreign key constraint fails....
  5. linux中的grep命令用法
  6. C 题 KMP中next[]问题
  7. Django 的信号 & Flask 的信号
  8. vagrant的学习 之 Laravel
  9. HDU 5883 欧拉路径异或值最大 水题
  10. Populating Next Right Pointers in Each Node (DFS,没想到)