摸鱼时突发奇想就用koa2搭建了个后台想做个登录功能,百度搜了下怎么搞验证码,其他的都没问题,就是发现session获取不到。
const Koa = require('koa'); //koa
// const Router = require('koa-router'); //koa的路由
const router = require('koa-router')();
const static = require('koa-static'); //静态资源加载
const bodyParser = require('koa-bodyparser'); //解析post请求
const cors = require('koa2-cors'); //解决跨域
const session = require('koa-session');
//实例化
const app = new Koa();
// const router = new Router();
const { routes } = require('./api/user/user');
//设置session
app.keys = ['some secret hurr'];
const CONFIG = {
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, //每次访问将会重置过期时间
renew: false //(boolean) 会话即将过期时续订会话
};
//注入依赖模块
app.use(cors({ credentials: true })); //解决跨域
app.use(static(__dirname + '/public')); //静态资源
app.use(bodyParser()); //解析post请求
app.use(session(CONFIG, app)); //启动session
app.use(router.routes()).use(router.allowedMethods()); //解析路由
routes.forEach((route) => {
router[route.type](route.url, route.callback);
});
app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
//开启服务
app.listen(23333, (_) => {
console.log('server running at http://localhost:23333');
});
这是我的app.js
const svgCaptcha = require('svg-captcha'),
{ sign } = require('jsonwebtoken'),
{ secret } = require('../../config/config'),
fs = require('fs');
let newData = [];
module.exports = {
routes: [
{
type: 'get',
url: '/login',
callback: async (ctx) => {
const query = ctx.query,
{ name, pwd, captcha } = query;
let token = '',
myBody = {};
if (ctx.session.userinfo) {
newData = [ctx.session.userinfo];
}
if (name === 'qwe' && pwd === 'qwe' && captcha === newData[0]) {
isSuccess = '0';
errorMSG = '登录成功';
token = sign({ name, pwd }, secret, { expiresIn: '1h' });
myBody = {
isSuccess: '0',
token,
timestamp: new Date().getTime(),
query
};
} else {
myBody = {
isSuccess: '1',
errorMSG: '用户名或密码不正确',
timestamp: new Date().getTime(),
query
};
}
ctx.session.ssdasdasd = 'asdad';
ctx.body = myBody;
}
},
{
type: 'get',
url: '/getRouteList',
callback: async (ctx) => {
const query = ctx.query;
let isSuccess = '0',
errorMSG = '';
let data = [
{
path: '/system',
component: 'Main',
deep: 1,
isFather: true,
nodeList: [
{
path: '/system/jurisdiction',
component: '/system/jurisdiction',
deep: 2,
isFather: false
},
{
path: '/system/role',
component: '/system/role',
deep: 2,
isFather: false
}
]
}
];
ctx.body = {
isSuccess,
errorMSG,
data,
timestamp: new Date().getTime(),
query
};
}
},
{
type: 'get',
url: '/getImgUrl',
callback: async (ctx) => {
const cap = svgCaptcha.create({
size: 4, // 验证码长度
width: 160,
height: 60,
fontSize: 50,
ignoreChars: '0oO1ilI', // 验证码字符中排除 0oO1ilI
noise: 2, // 干扰线条的数量
color: true, // 验证码的字符是否有颜色,默认没有,如果设定了背景,则默认有
background: '#eee' // 验证码图片背景颜色
}),
clientId = ctx.cookies.get('clientId'),
captcha = require('../../data/captcha.json');
let img = cap.data, // 验证码
text = cap.text.toLowerCase(); // 验证码字符,忽略大小写
ctx.session.captcha = text;
ctx.response.type = 'image/svg+xml';
if (clientId) {
captcha[clientId] = text;
// fs.writeFile('../../data/captcha.json');
}
ctx.body = img;
}
}
]
};
这是路由表
关于session的配置
设置session
关于前端是用的vue。axios的session设置已经打开了
而且前端验证码都加载出来了,控制台里也没有新增的cookie