长风犹在旧人还 2021-04-07 11:09 采纳率: 0%
浏览 162

koa2搭建后台实现登录验证码功能,获取不到session

摸鱼时突发奇想就用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

  • 写回答

1条回答 默认 最新

      报告相同问题?

      相关推荐 更多相似问题

      悬赏问题

      • ¥15 下载CSGO服务端时出错
      • ¥20 esp8266知心天气blinker上面显示
      • ¥20 python代码的实现讲解
      • ¥20 python代码实现,讲解
      • ¥30 六足机器人硬件配置问题
      • ¥15 uniapp ios端配置universal link无法唤起app
      • ¥70 java通过ISUP SDK开发连接海康威视获取PS封装流如何推送到web页面
      • ¥15 并且拖拽过去在picturebox上的数据也可以实现拖拽换位置的功能,
      • ¥15 AndroidStudio:fragment里的content怎么写?
      • ¥30 关于#vba数组#的问题,如何解决?