Koa2学习(八)使用session
2024-09-07 08:11:58
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
- 这个ctx.session是针对某一个浏览器用户的。
- 不断地刷新访问浏览器,浏览器上显示的访问次数会增加。
- 如果不使用数据库,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
- 当用户登陆到login页面时,session会将zhangsan保存为user_name。
- 用户访问index页面时,session会对当前的user_name做匹配,如果匹配成功,则认证登陆成功。
- 用户访问logout页面是,session会自我销毁。
- 这样再次访问index页面时,登陆就会失败。
最新文章
- ASP.NET从MVC5升级到MVC6 RC2 总目录 - 发布在RC2Release之后
- Android 判断SIM卡属于哪个移动运营商
- Es6 学习笔记
- Activity有四种加载模式(转)
- OpenGL es3.0 初始化及渲染
- 【转】【C#】在 Windows 窗体 DataGridView 单元格中承载控件
- 【POJ】2954 Triangle(pick定理)
- 移动端Web页面问题
- POJ 3181 Dollar Dayz(高精度 动态规划)
- bzoj2337
- iOS7支持九宫格
- Jsoup API解析HTML中input标签
- jqGrid Demos
- shell脚本语法学习
- tomcat 、NIO、netty 本质
- 30.深入理解abstract class和interface
- 排错-SP2-1503:无法初始化Oracle调用界面解决
- 在vultr中安装coreos
- 最简单的css实现页面宽度自适应
- Codeforces gym101955 A【树形dp】
热门文章
- vue 项目部署
- LeetCode(21)Merge Two Sorted Lists
- scrollLeft属性设置无效的一个记录
- Cannot delete or update a parent row: a foreign key constraint fails....
- linux中的grep命令用法
- C 题 KMP中next[]问题
- Django 的信号 &; Flask 的信号
- vagrant的学习 之 Laravel
- HDU 5883 欧拉路径异或值最大 水题
- Populating Next Right Pointers in Each Node (DFS,没想到)