express session保存数据问题

express session不能保存数据,cookie不能回传到浏览器,皆是因为cookie的同源限制策略

问题描述:

在这之前先说一下我要做的事:

完成功能:用验证码登录
实现流程:

  1. 输入手机号并进行正则验证;
  2. 点击验证码按钮,获取验证码;
  3. 后端生成验证码,这里除了需要把验证码返回到前端,还需要将其保留在后端;
  4. 前端输入验证码,点击登录;
  5. 后端验证手机号和验证码是否正确;

问题: 在后端进行验证码保存的时候,我使用express里面的session中间件来对验证码进行保存,但是每次保存之后,在登录验证获取保存在session里面的验证码的时候发现是undefined
在这里插入图片描述
session配置:

app.use(session({
    name: 'codelogin',
    secret: 'login',
    resave: false,
    cookie: {
        maxAge: 600000
    },
    saveUninitialized: true
}));

api接口代码:

router.post('/codelogin', function (req, res) {
    console.log('req',req.body);
    console.log('session:',req.session.code);
    res.send({
        code: 0,
        message: '登录成功'
    });
})

router.post('/code', function (req, res) {
    const { phonenumber } = req.body;
    const sql = `select * from user where phonenumber='${phonenumber}'`;
    db.query(sql, function (err, result) {
        if (err) {
            res.status(500);
            res.send({ err });
        } else if (result !== []) {
            req.session.code = 1234;
            res.send({
                code: 0,
                data: 1234,
                result
            });
        }else{
            res.send({
                code: 1,
                data: '用户不存在',
            });
        }
    });
})


后来经过n次百度,终于发现了问题所在

在这之前先说一下express session的机制:

在配置了session中间件之后,在每次处理请求时有一下流程

  1. 看request是否携带了sid的cookie;
  2. 如果没有sid,则在服务端(内存,redis,mongodb)创建一个session,并分配一个sid在响应中给客户端,下次客户端就会带着这个sid cookie上来;
  3. 如果有sid,但是在服务端找不到对应的session,那么也创建一个,并重新分配sid;
  4. 如果有sid,并且能找到对应的session,则把session中储存的值取出来,放在req.session对象上。

到这里我就发现,之所以我的req.session里面没有code可能有以下原因:

  1. 获取验证码之后生成的cookie没有保存到浏览器当中;
  2. 在发送请求的时候没用发送cookie;
  3. 发送的cookie里面没有响应的sid;

后来发现我的情况是第一种
在这里插入图片描述
返回的cookie里面存在Name值为codelogin的cookie
在这里插入图片描述
但在浏览器的Application里面并没有响应的cookie

所以在点击登录之后发送的请求里面自然就不会携带cookie
在这里插入图片描述
之所以会造成这些的原因,就是因为cookie的同源限制策略

最后解决的办法如下:

在cookie里面加了一个domain

app.use(session({
    name: 'codelogin',
    secret: 'login',
    resave: false,
    cookie: {
        domain:'127.0.0.1',
        maxAge: 600000
    },
    saveUninitialized: true
}));

最后Application里面cookie也有了
在这里插入图片描述
后端里面的req.session.code也打印出来了
在这里插入图片描述
还需要注意的就是页面的localhost:3000也需要改成127.0.0.1,和domain里面的保持一致

当然也别忘记了发送请求以及响应的跨域问题:

app.all('*',function (req,res,next) {
    res.header("Access-Control-Allow-Origin", "http://127.0.0.1:3000");
    res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    res.header('Access-Control-Allow-Credentials','true');
    next();
})

前端发送请求的时候需要设置

withCredentials: true

参考文章:
express处理多域名环境下的session
如有问题,请多指教!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值