cookie是服务端(服务器)发给客户端(网页)的会员卡,存在客户端,由客户端访问时携带给后端,可以储存信息,由于cookie在前端是完全暴露的,所以安全性特别低。于是乎就有了session
session是存在服务器内存中的数据,通过客服端携带的cookie对应可以找到session中存储的数据信息。如果客户端伪造了cookie则无法对应已存在的信息,安全性相对较高
使用express-sessionnpm install express-session
const express=require('express'); //express 框架模块
const session=require('express-session'); //express中是把session信息存储在内存中
const app = express();
const sessionConfig={
secret: 'jone_keystore', // 加密钥匙串
resave: false, // 每次都立即刷新?
name:'jone_session_name', // session的名字
saveUninitialized: true,//无论是否使用sessionid都默认分配一把钥匙,如果设置为false就是传数据的时候才分配钥匙
cookie: {
maxAge: 1000 * 3600 * 24, // 时长
secure: false // https则设置true
}
}
app.use(session(sessionConfig))
存、取
app.get('/setSession', (req:Request,res:Response) => {
req.session.mySelfKey='myToken';
})
app.get('/getSession', (req:Request,res:Response) => {
res.send(req.session.mySelfKey).end();
})
前端axios要设置
axios.defaults.withCredentials = true;
由于前端上面这个配置,所以后端要以下两点改动,否则前端会报跨域。
1、把 Access-Control-Allow-Origin指定为前端部署站点的域名地址,我这边直接现取。
2、设置Access-Control-Allow-Credentials = true。
app.all('*', (req: Request, res: Response, next: NextFunction) => {
let origin = req.headers.origin;
//设置允许任何域访问
res.header('Access-Control-Allow-Origin', origin ? origin:'*'); //取访问源的站点
//设置 允许任何 数据类型
res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With');
//设置 允许 使用的HTTP方法
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
// 兼容前端withCredentials=true的设置
res.header('Access-Control-Allow-Credentials', 'true');
//过滤预请求
if (req.method === 'OPTIONS') {
res.sendStatus(200); //如果是预请求 就不再进行后面的中间件匹配执行了 直接发送回数据
} else {
next();// 进入下一个中间件
}
});
此时,访问setSession再访问getSession,看看能拿到设置的值了吗
如果不行,则可以检查前端network,查看请求的request Headers中Host和Origin的ip地址是否一致,如果不一致,cookie也不会被携带。前端要解决则就是部署到后端同域名的站点下。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)