Session的原理其實仍是依賴了Cookie,因此Cookie纔是記錄用戶憑證的真理。它的原理大概是醬紫的:服務器端維護一個session的表,這個表的每一條記錄存的就是與某一個客戶端的會話,會話會有過時時間,過時的會話會被清理。而後這個會話,會有一個對應的id,通常是一串長長的看不懂的字符串,而後這個字符串會被存儲在客戶端的cookie中,每一次請求服務器端都會帶上這個cookie,服務器端就知道訪問的就是哪一個客戶端了。前端
koa2框架不提供session的處理方法,這裏咱們須要藉助一個第三方中間件koa-session來處理session。git
app.jsgithub
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)
複製代碼
這個ctx.session是針對某一個瀏覽器用戶的。redis
不斷地刷新訪問瀏覽器,瀏覽器上顯示的訪問次數會增長。數據庫
若是不使用數據庫,session是保存在內存中的。在服務端一般會使用redis等方案來使session持久化。瀏覽器
如今咱們來模擬一個簡單的登錄:bash
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)
複製代碼
一個最簡單的session登陸就實現了。下面是我寫的一個登陸註冊demo登陸註冊服務器
github地址是github.com/qz9527/koa2,若是以爲有用的話,歡迎star。cookie
小強前端交流羣QQ羣:724179055session
定時分析技術和資料,歡迎你們進來一塊兒交流。
往期回顧地址: