资讯专栏INFORMATION COLUMN

node.js中cookie数据丢失导致session失效问题

callmewhy / 3073人阅读

摘要:问题今天刚准备用作为后端语言来开发就遇到了一个小坑,网上的资料还是比较的少,于是我决定记录下来。客户的信息都保存在中。导致问题出现的原因跨域时保存的数据丢失了因为中使用的是端口,我启的服务器用的是端口,端口不一样也就存在着跨域的问题。

问题

今天刚准备用node.js作为后端语言来开发就遇到了一个小坑,网上的资料还是比较的少,于是我决定记录下来。关于session和cookie我就不做具体的介绍了,网上有挺多资料的。我打算实现的功能:登录,在用户登录之后,把用户的uname存到session里面,在访问一些需要登录之后才能访问的页面的时候,去sesion中查看时候在该值是否存在,存在则已经登录,不存在则未登录(一个比较简单的功能)。但是我发现,在登录之后,我去设置req.session.user的值,再马上console.log(req.session.user)的值发现是可以取到的;跳转到别的页面之后,我再去请求req.session.user发现该值为空,不存在。
剧透一下:该问题是由于跨域时cookie保存的数据丢失了而导致的,详细可看下面
代码和效果如下
index.js

const http = require("http")
const express = require("express");
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");
const session = require("express-session");
const cors = require("cors");
const pool = require("./pool");
const routerUser = require("./router/user");

let app = express();

http.createServer(app).listen(8081);

// 中间件
app.use(bodyParser.urlencoded({
  extended: false 
}));
app.use(cors({
    origin:["http://127.0.0.1","http://localhost","http://127.0.0.1:8080","http://localhost:8080"],
    credentials:true
}));
app.use(cookieParser());
app.use(session({
    secret:"logaawing",
    cookie:{maxAge:60000},
    resave:false,                //每次请求是否需要重新设置cookie
    saveUninitialized:true      //无论是否有cookie,设置标记connect.sid可改名
}));

// 路由器
app.use("/user",routerUser);

user.js //user.js在和index.js同级的router目录下

const express = require("express")
const pool = require("../pool.js");
let router = express.Router();
module.exports = router;

router.post("/login",function(req,res){
    let uname = req.body.uname;
    let upwd = req.body.upwd;
    let sql = "SELECT user_name FROM home_admin WHERE aname = ? AND apwd = md5(?)";
    pool.query(sql,[uname,upwd],(err,result)=>{
        if(err) throw err;
        if(result.length>0){
            username = result[0].user_name;
            req.session.user = username;
            console.log(req.session);
            res.json({errno:0,uname:username});
        }else{
            res.json({errno:1,msg:"登录失败,账号或密码错误"})
        }
    })
})

router.get("/session",function(req,res){
    console.log(req.session);
    res.send(req.session.user);
})

注:我这两次访问是在同一个会话里访问的
从图片中可以发现,我在同一个会话里再次去访问session,发现这个session已经不是同一个session了,我存进去的user也不见了。

思考

出现问题就要解决问题嘛。因为node.js学了也不太久,也没怎么用过session,我一开始一直以为是由于我的session哪个位置写错了所以导致了这个问题的产生, 后来想起之前有个朋友给我说过nodejs中的session有一个坑是跨域导致的。于是我就朝着这个方向去找解决的方法。

解决

session的工作流程:当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于key,value的键值对, 然后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),找到对应的session(value) 。 客户的信息都保存在session中。
导致问题出现的原因:跨域时cookie保存的数据丢失了
因为vue中使用的是8080端口,我node.js启的服务器用的是8081端口,端口不一样也就存在着跨域的问题。
于是我在客户端中的请求信息中加上了withCredentials:true,也就是在发起请求的时候要求它一定要带上cookie信息
我是用vue进行开发的,下面是在vue中的方法(请求的时候加上credentials: true):

在一般的ajax请求中则要加上

$.ajax({
    xhrFields:{withCredentials:true}
      });

在进行了以上的修改之后再次运行程序可以发现,在同一个会话中再次访问session的时候,user的值没有丢失

以上就是我使用node.js exprees框架中的session所遇到的问题以及解决方法,有哪里写的不对的欢迎大家指出,谢谢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107034.html

相关文章

  • 做了「负载均衡」就可以随便加机器了吗?这三招来帮你!

    摘要:因为我们认为正常情况下用户的不会在短时间内发生变化,所以当我们选择使用策略进行负载均衡时,意味着期望同一个用户能够一直访问到同一台服务器上,就像下图这样。但是,我们还需要明白一个事实严格来说保持本质上是破坏了做负载均衡的初衷。 本文长度为3056字,预计读完需1.1MB流量,建议阅读8分钟。 这篇是《分布式关注点系列》中「负载均衡」相关的内容最后一发了,后续也会继续讲「高可用」相关的其...

    沈建明 评论0 收藏0
  • Python3网络爬虫实战---18、SessionCookies

    摘要:而在中对象用来存储特定用户会话所需的属性及配置信息。当会话过期或被放弃后,服务器将终止该会话。,即该是否仅被使用安全协议传输。安全协议有,等,在网络上传输数据之前先将数据加密。 上一篇文章:Python3网络爬虫实战---17、爬虫基本原理下一篇文章:Python3网络爬虫实战---19、代理基本原理 在浏览网站的过程中我们经常会遇到需要登录的情况,有些页面只有登录之后我们才可以访问...

    SHERlocked93 评论0 收藏0
  • session与登录机制

    摘要:每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。由于可以被人为的禁止,必须有其他机制以便在被禁止时仍然能够把传递回服务器。 github 地址:戳这里 session 概念 指一类用来在客户端与服务器之间保持状态的解决方案 这种解决方案的存储结构 特点 由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。...

    nifhlheimr 评论0 收藏0
  • sessioncookie

    摘要:的作用就是为了解决协议无状态的缺陷所作的努力。的内容主要包括名字,值,过期时间,路径和域。这种生命期为浏览器会话期的被称为会话。而机制采用的是一种在服务器端保持状态的解决方案。中的有效期默认分钟,也就是说,客户端超过分钟,当前就会失效。 会话控制是什么? cookie和session都是跟踪整个会话过程的技术手段。而会话,就是用户通过浏览器和服务器的一次通话。 为什么要有会话控制? 因...

    ruicbAndroid 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<