十四、Node.js 中 session验证登录

news2024/12/24 2:45:30

         在前一篇内容中讲到这个cookie实现验证登录,cookie是存储在客户端的,而session是存储在服务器的,相比较session的安全性会更高,session对象存储特定用户会话所需要的属性以及配置信息,服务通过session对象将用户的信息临时保存在服务器中,客户无法进行修改,反观cookie是存储在客户端,用户可以进行伪造修改,所以使用session是比cookie更安全,下面来看一下session的工作原理:

        浏览器第一次发起请求到服务器,服务器会创建一个session,服务器就会依赖cookie返回一个对应的sessionid给浏览器进行保存,浏览器在下一次发起请求时将会携带sessionid进行访问,服务器会进行检查是否有该sessionid的存在,如果存在的话就会找到对应sessionid相应的文件,sessionid为键,而值就是用户的信息了。 


session 的设置 - 获取

        下面先通过express命令来创建 express框架项目环境 (具体安装过程不再讲解,在之前的内容当中已经有了详细的讲解了,可以订阅然后翻阅之前的篇目):

 session数据处理的第三方中间件安装命令:

npm install express-session -S

引入中间件配置 —— app.js文件

app.use(session(option))

可以通过请求对象提供的session属性获取:

req.session

下面来编写代码:—— index.js 

var express = require('express');
var router = express.Router();
var session = require('express-session');

// 配置中间件
router.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
  cookie:('name','value',{
    maxAge:5*60*1000,
    secure:false
  })
}))

router.use('/login',function(req,res){
  // 设置session
  req.session.userinfo = 'YAN';
  res.send("登录成功");
})

router.use('/',function(req,res){
  // 获取session
  if(req.session.userinfo){
    res.send("已登录");
  }else{
    res.send("未登录");
  }
})

router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

2. 将项目运行起来之后通过浏览器请求 http://127.0.0.1:3000 和 http://127.0.0.1:3000/login ;

         以上是还没登录,那么可以通过 http://127.0.0.1:3000/login 进行登录拿到服务器返回的cookie实现登录;

        然后F12打开控制台进行查看cookie信息;

        现在在浏览器上重新请求url : http://127.0.0.1:3000/ ,可以看到进入已登录的状态;


下面来将上一篇目中使用cookie实现登录注册的案例进行修改:

session 验证登录

        session验证登录案例的实现过程与cookie相差不大,仅是验证方式的不一样;那么就不再过多的详解进行代码的编写工作:

在未学习数据库之前先来通过编写json数据来模拟可以进行登录的用户信息数据,在public目录下来编写一个user.json文件存储;

[
    {
        "id":"1001",
        "username":"YAN",
        "password":"yan"
    },
    {
        "id":"1002",
        "username":"SEN",
        "password":"sen"
    },
    {
        "id":"1003",
        "username":"LIN",
        "password":"lin"
    }
]

设置路由文件 —— index.js 

        这里面的内容基本上是我们在之前篇目当中讲过的内容了,所以不再进行过多的讲述;

var express = require('express');
var router = express.Router();
var session = require('express-session');
var fs = require('fs');
const { resolve } = require('path');

// 配置中间件
router.use(session({
  secret: 'author lhxz',
  resave: false,
  saveUninitialized: true,
  cookie:("csdn",'value',{
    maxAge:5*60*1000,
    secure:false
  })
}))

router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.get('/checklogin',function(req,res){
  // 获取session
  if(req.session.userinfo){
    res.send({
      code:0
    });
  }else{
    res.send('alert("请先登录...");location.href = "./login.html"');
  }
})

router.post('/login',function(req,res){
  let user = req.body.username,pwd = req.body.password;  
  let results = fs.readFileSync(resolve(__dirname,'../public/user.json'));
  results = JSON.parse(results);
  for(var i = 0; i<results.length; i++){
    if(results[i].username == user && results[i].password == pwd){
        req.session.userinfo = 'lhxz';
        res.send({
          code:0,
          msg:'ok'
        })
        return;
    }
  }
  if(i==results.length){
    res.send({
      code:1,
      msg:'error'
    })
  }
})

module.exports = router;

配置 app.js文件

        这里主要是配置 resolve ,通过 resolve 处理路径;

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var session = require('express-session');
var {resolve} = require('path');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(resolve(__dirname,'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

托管静态资源文件:

        主要有两个前端的两个页面文件,login.html(登录页面),index.html(首页);

login.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="content">
        <div class="head">
            <img src="../images/CSDN.png" alt="" srcset="">
        </div>
        <form action="">
            <div class="form-input">
                <div class="form-data">
                    <span>账户:</span>
                </div>
                <input type="text" class="input-text" name="username" value=""/>
            </div>
            <div class="form-input">
                <div class="form-data"> 
                    <span>密码:</span>
                </div>
                <input type="password" class="input-text" name="password" value=""/>
            </div>
        </form>
            <input type="submit" class="form-submit" value="登录" id="btuLogin" />
    </div>
</body>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script>
    $('#btuLogin').click(function(){
        $.ajax({
            type:'post',
            url:'/login',
            data:$('form').serialize()
        }).then(function(res){
            if(res.msg == 'ok'){
                // 跳转
                location.href = './index.html'
            }else{
                alert("账户或密码错误,请重新输入");
                // 清空
                $('input[name=username]').val('');
                $('input[name=password]').val('');
                // 获取焦点
                $('input[name=username]').focus();
            }
        })
    })
</script>
</html>

​

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSDN</title>
    <script src="/checklogin"></script>
</head>
<body>
    <header>
        <h3>首页</h3>
    </header>
    <div class="content">
        <p>正在维修中...</p> 
    </div>
</body>
</html>

测试运行

1. 把项目跑起来 —— npm start ;

2. 浏览器中输入url地址: http://127.0.0.1:3000/index.html

        此时浏览器中还没有cookie(服务器返回的一个cookie),会跳转回登录页面

3. 浏览器进入登录页面;

 

6. 重新输入在user.json中存在的用户数据信息;

7. 输入正确用户信息登录是否正常跳转且在浏览器中保存cookie;

以上的步骤基本与cookie是相同的,唯有下面的这一项:

         以上就是session进行验证登录的一个全部过程,使用cookie和session需要考虑传递的信息内容是否是私密的,若是的话可以选择安全性比较高的session,而如果不是的话cookie和session两者都是可以的,那么本篇目的内容就到此结束,感谢大家的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CPU使用率过高的原因及解决方法

常见的CPU使用率过高可不是职场CPU哦&#xff0c;而是电脑的中央处理器&#xff0c;CPU作为计算机系统重要的运算和控制核心&#xff0c;可谓是“很忙”的存在。在我们日常使用电脑设备时&#xff0c;由于打开的软件、游戏、网页等程序容易导致电脑运作卡顿&#xff0c;这时候就…

《图机器学习》-Traditional Methods for Machine Learning in Graphs

Traditional Methods for Machine Learning in Graphs前言一、Node-Level Tasks and Features二、Link-Level Tasks and Features三、Graph-Level Tasks and Features前言 图机器学习任务可以分为三种&#xff1a; Node-level prediction&#xff1a;节点级的预测 如对节点进…

最优控制学习笔记3----无约束条件的泛函极值问题

无约束条件的最优控制问题 设函数 x(t)x(t)x(t) 在 [t0,tf][t_0, t_f][t0​,tf​] 区间上连续可到&#xff0c;考虑 Lagrange型性能指标函数 J[x(t)]∫t0tfL[x(t),x˙(t),t]dtJ[x(t)]\displaystyle\int_{t_0}^{t_f}L[x(t), \dot{x}(t), t]dtJ[x(t)]∫t0​tf​​L[x(t),x˙(t),…

Linux---常见指令

目录 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令 06.rmdir指令 && rm 指令 07.man指令 08.cp指令 09.mv指令 10. cat指令 11.more指令 12.less指令 13.head指令 13.tail指令 简述重定向和管道概念&#xff1a; 14.时间相关的指令 15.Ca…

Git Fork操作与配置

我理解的git fork&#xff1a;将别人&#xff08;张三&#xff09;仓库包括文件&#xff0c;提交历史&#xff0c;issues等复制一份到自己的github账号下。我们在可以通过修改本地项目的代码&#xff0c;然后&#xff0c;给&#xff08;张三&#xff09;发送一个Merge Request&…

C. Yet Another Tournament(贪心)

Problem - C - Codeforces 通用领域 医学 计算机 金融经济 你正在参加另一场比赛。有n1个参与者:你和其他n个对手&#xff0c;编号从1到n。 每两名参与者将相互竞争一次。如果对手i和对手j比赛&#xff0c;他获胜当且仅当i>j。 当我的对手和你对弈时&#xff0c;一切都变…

rabbitmq+netcore6 【4】Routing:路由

文章目录1&#xff09;前言2&#xff09;Direct exchange 直接类型的交换机3&#xff09;Multiple bindings 多绑定4&#xff09;Emitting logs 发送日志5&#xff09;Subscribing 订阅6&#xff09;综合以上代码准备工作生产者消费者1消费者2消费者3运行结果官网参考链接&…

USB大容量存储设备浅析

一 USB 设备类 SB 引入了设备类的概念&#xff0c;根据每一类驱动程序的功能将USB设备分为几大类&#xff0c;标准的几大类包括&#xff1a; 大容量存储类 网络类 集线器类 串行转换器 音频类 视频类 图像类 调制解调器 打印机 HID(Human Interface Device 人机接口设备)每一…

我记不住的那些编程语言的语法(数组)-1

背景&#xff1a;我记不住各种语言的语法&#xff0c;例如C、Java、Go、Python、JavaScript&#xff0c;大概就是常用的这几种语言&#xff0c;每种语言有其自己的语法规范&#xff0c;有的时候会记混了&#xff0c;所以想记录一下细节。这个系列会不定期的更新&#xff0c;本期…

一路坎坷,入局到突破【2022年度总结】

秃秃 1> 来到CSDN&#xff1a; 2019年5月时决定只身一人去外省实习&#xff0c;顺便在CSDN这个“资源库”注册了一下账号。直到我20年在公司做技术分享时&#xff0c;才真正开始在CSDN上的创作&#xff1b; 21年的时候也只是把CSDN当做笔记&#xff0c;就自己写一写&…

行业洞察|猴子可以打字,动物走进元宇宙还有多远?

很多学者和专家认为&#xff0c;人类与动物的区别在于语言的使用。人类可以使用语言&#xff0c;但是动物不会。其实也许是我们人类听不懂动物的语言&#xff0c;并不是他们不会使用。本质在于沟通的媒介不同&#xff0c;导致我们无法相互交流。但是&#xff0c;埃隆马斯克&…

App原型设计规范

一、界面尺寸 1.ios分辨率 2.android界面尺寸 ① 安卓分辨率 ②常见安卓手机分辨率及尺寸 一般情况下大家在设计app端原型的时候&#xff0c;由于现在ios和安卓慢慢在趋向一致&#xff0c;所以基本上都只会设计一套原型&#xff0c;尺寸方面一般都是按照iphone6的750*1344(2倍…

Django 数据备份dumpdata 踩的坑

项目背景&#xff1a; 项目使用的是sqlite数据库&#xff0c;要求备份除了网络表之外的所有数据 实施方案&#xff1a; python3 manage.py dumpdata --exclude network.TRoute --indent 2 --format json > aq3.json 方案操作结果是&#xff1a; 查看aq3.json如下&#xff…

一文详解GCC7、CUDA 11.2、CUDNN部署

在部署之前&#xff0c;需要了解下python-tensorflow-cuDNN-CUDA版本对应关系,以便能够完全兼容下文以此版本为例部署gcc-7.3.1gpu driver-460.106.00cuda-11.2cudnn-8.1.1一.gcc部署1.安装[rootgpu ~]# yum -y install centos-release-scl [rootgpu ~]# yum install devtoolse…

《收获,不止Oracle》索引细化

1.索引知识图框 2.索引探秘 2.1 BTREE索引 索引是建在表的具体列上的&#xff0c;其存在的目的是让表的查询变得更快&#xff0c;效率更高。表记录丢失关乎生死&#xff0c;而索引丢失只需重建即可。 索引却是数据库学习中最实用的技术之一。谁能深刻地理解和掌握索引的知识&…

Spring gateway websocket自定义负载均衡

业务需求 公司IM服务主要基于netty实现websocket&#xff0c;为保证在线用户channel通道畅通故一直使用单机运行。现由于公司业务增加需要增加IM集群&#xff0c;由于channel通道不能缓存&#xff0c;故急需一套可以完整兼容之前功能的方案。 技术选型 1、采用spring websocke…

Bonree ONE荣获信通院“2022IT新治理年度明星产品”

今日&#xff0c;由信通院主办的“GOLFIT新治理领导力论坛”正式召开&#xff0c;论坛上公布了2022IT新治理年度评选活动的结果&#xff0c;博睿数据一体化智能可观测平台Bonree ONE凭借卓越的产品力以及优秀的用户体验&#xff0c;从一众产品中脱颖而出&#xff0c;获得“2022…

spring 事务@Transantional 失效及解决方案和总结

1、线程中方法&#xff0c;事务会失效 2、线程中方法&#xff0c;事务会失效。即使在线程方法上增加Transactional注解 3、事务正常回滚&#xff0c;A方法调用B的普通方法 4、事务正常回滚。A方法调用B的private普通方法 6、会抛出NullPointerException异常。 Methods ann…

rock3a: 基于自建数据集+yolov5s模型的rknn模型训练部署全流程

上一篇文章其实已经详述了模型训练到部署的整个流程&#xff0c;但是数据集到模型都是用的官方的coco数据集&#xff0c;这里为了记录开发板的模型训练到部署的整个流程&#xff0c;重新开了一篇文章进行记录。 首先准备数据集和rockchip官方推荐的yolov5源代码 这里需要注意的…

基于Node.js Vue企业产品展示网站

摘 要随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&am…