问题

今天刚准备用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,                //每次请求是否需要重新设置cookiesaveUninitialized: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所遇到的问题以及解决方法,有哪里写的不对的欢迎大家指出,谢谢!

node.js中cookie数据丢失导致session失效问题相关推荐

  1. 模块加载及第三方包:Node.js模块化开发、系统模块、第三方模块、package.json文件、Node.js中模块的加载机制、开发环境与生产环境、cookie与session

    1.Node.js模块化开发 1.1 JavaScript开发弊端 JavaScript 在使用时存在两大问题,文件依赖和命名冲突. 1.2 软件中的模块化开发 一个功能就是一个模块,多个模块可以组成 ...

  2. Node.js中的不安全跳转如何防御详解

    为什么80%的码农都做不了架构师?>>>    Node.js中的不安全跳转如何防御详解 导语: 早年在浏览器大战期间,有远见的Chrome认为要运行现代Web应用,浏览器必须有一个 ...

  3. 在 Node.js 中操作 Redis

    在 Node.js 中操作 Redis Node.js 中可以操作 Redis 的软件包推荐列表:https://redis.io/clients#nodejs. 推荐下面两个: node-redis ...

  4. 消息队列Rabbitmq,在Node.js中的应用

    为什么写这篇文章 现在的面试要求越来越高了,打开看了看几个 BOSS 招聘 Node.js 全栈开发的,其中都有一条"了解 消息队列,并在项目中应用过",呜呜呜 后端开发者应该都知 ...

  5. 2021-09-11 consolidate 模板引擎整合库,Node.js 中 __dirname 和 ./ 的区别

    consolidate 模板引擎整合库[适配] npm install consolidate 在工作路径的views目录下,新建1.ejs <!DOCTYPE html> <htm ...

  6. node.js中模块_在Node.js中需要模块:您需要知道的一切

    node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...

  7. iframe中请求页面而session失效时页面跳转问题

    访问相关jsp页面时,往往要先判断用户session是否失效,以便决定是继续业务,还是跳转到登录页面.这个事情我们通常是用过滤器来实现的.由过滤器判断session是否失效,由此来决定请求继续还是跳转 ...

  8. 如何在node.js中发出HTTP POST请求?

    如何在node.js中使用数据发出出站HTTP POST请求? #1楼 如果您使用请求库,这会变得更容易. var request = require('request');request.post( ...

  9. 如何在Node.js中退出

    用于退出的命令是什么? (即终止Node.js进程) #1楼 从命令行, .exit就是你想要的: $ node > .exit $ 它在REPL文档中有记录 . REPL(Read-Eval- ...

最新文章

  1. 在Ubuntu 16.04.6 LTS升级python 3.5.x到3.7.3之后导致gnome-ternimal无法打开的解决办法
  2. Java 8 获取某天最大(23:59:59)最小(00:00:00)时间
  3. mysql使用主从复制迁移,[MySQL进阶之路][No.0003] 主从复制(Replication)在运维中的运用...
  4. 腾讯 Omi 团队发布 mps - 原生小程序插上 JSX 、Less 和 Cloud 的翅膀
  5. linux进程map,LInux环境运行mapReduce程序
  6. HttpModule,HttpHandler 简介
  7. isp和3a的联系与区别是什么?
  8. 【Linux】shell调用Java程序main方法通过crontab定时执行
  9. 初接触RTMP流媒体实时消息传输协议
  10. 【matlab】解决每次打开.m文件都会弹出新窗口
  11. 人脸识别之一图像采集及人脸库的建立
  12. cad批量打印_CAD插件之批量打印1
  13. CSP202006-1 线性分类器(100分)【数学】
  14. bp神经网络训练流程图,bp神经网络训练样本
  15. C++代码实现图片调色
  16. BinaryFormatter serialization and deserialization are disabled within this application
  17. 安庆集团-冲刺日志(第六天)
  18. 法外狂徒——格雷福斯
  19. 仿真软件 JaamSim介绍
  20. git color 让git有颜色

热门文章

  1. C语言数据结构单项链表
  2. google翻译使用技巧
  3. 学建筑要学哪些计算机绘图,《建筑制图(含计算机绘图)》教学大纲.doc
  4. IOS 逆向开发(二)密码学 HASH
  5. C++: 团体程序设计天梯赛 (一帮一)
  6. 在 Windows 10 上使用 Hyper-V 创建虚拟机-01
  7. PID里的PI调节器
  8. MySQL InnoDB Cluster
  9. Xshell和Xftp免密钥激活版
  10. 深入理解Java虚拟机笔记之六内存分配与回收策略