Node.js 中 cookie的验证登录

news2024/9/20 1:03:04

认识 cookie 

        在讲cookie的登录验证之前,先来了解一下cookie是什么?cookie本质是存储在浏览器中的一小段文本信息(不超过4kb),是由服务器生成发送到浏览器(客户端),浏览器将其保存在本地,接下来用户向服务器发起请求会将cookie一同发送给服务器,服务器通过识别cookie来辨认用户信息;cookie特性:1.自动发送;2.域名独立;3.过期时限;4.限制4kb;cookie不具备安全性:从上述知道了cookie是存储在浏览中的,而浏览器提供了能够读写的 cookie 的API,因此cookie 很容易会被伪造,不具有安全性,如有重要的隐私数据不推荐使用cookie发送给客户端。

cookie 的设置 - 获取

        下面来生成express框架的项目环境,处理cookie需要使用到这个中间件cookie-parser,一般用express命令生产项目会自动安装这个中间件(app.js文件中),如通过局部安装的话,需要用到如下的命令安装cookie-parser中间件;

npm install cookie-parser -S

全局安装仅需要引入使用:

const cookie = require('cookie-parser');

(express项目安装不清楚可查看前面的篇目)

 设置cookie

res.cookie(name,value[,options]);

(键)name是cookie名称,(值)value是cookie的值;

options参数:

获取cookie 

options 参数未设置 singed为true时,如下:

req.cookies

options 参数设置了 singed为true时,如下:

req.singedCookies

 1. 代码编写:

var express = require('express');
var router = express.Router();
const cookie = require('cookie-parser');

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

// cookie设置
router.get('/set',function(req,res){
    res.cookie("author",'lhxz',{
        maxAge:20000,
    })
    res.send("cookie set success!")
})

// 获取cookie
router.get("/getCookie",function(req,res){
    console.log(req.cookies.userName);
})


module.exports = router;

2. 测试运行

        通过浏览器F12调出Application查看设置的cookie信息;最后通过浏览器请求url地址 http://127.0.0.1:3000/getcookie 则会打印cookie;


 下面来通过cookie来做一个验证登录,在讲express框架的时候讲到可以通过express.static()方法来托管静态资源,下面来通过它来静态的管理静态页面(暂不用模板引擎pug / ejs);

cookie 验证登录

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

用户数据存储 —— 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();
const fs = require('fs');
const {resolve} = require('path');

/* GET home page. */
router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});

// 检查是否登录
router.get('/checklogin',function(req,res){
    // 首先检查是否有cookie
    let cookie = req.cookies.userName;
    if(!cookie){
        res.send('alert("请先登录...");location.href = "./login.html";')
    }else{
        res.send({
            code:0
        });
    }
})

// 登录路由
router.post('/login',function(req,res){
    // 获取前台发送过来的账户密码
    let user = req.body.username,pwd = req.body.password;

    // 读取user.json数据,遍历是否有该用户信息;
    let results = fs.readFileSync(resolve( __dirname,'../public/user.json'));
    results = JSON.parse(results);  
    console.log(results);
    // 验证 —— 遍历
    for(var i = 0; i<results.length; i++){
        if(results[i].username == user && results[i].password == pwd){
            // 验证成功则发送cookie
            res.cookie("userName",user,{
                maxAge:200000000,
                httpOnly:true
            })
            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 {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进入首页(index.html)会弹出提示需要先登录,点击登录之后会跳转登录页面;

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

4. 随便输入在user.json中没有的用户信息;

 5. 用户识别错误信息提示,且清空输入框并在账户输入框获取焦点;

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

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

        以上就是通过 cookie 来进行验证登录的全部过程了,cookie是存在于浏览器中的,安全性不高,而在下一期会讲到这个session,称 "会话控制",session是存在于服务器当中的,安全性比较高,那么本篇就到此结束了,感谢大家的支持!

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

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

相关文章

虚拟化技术学习笔记2

1、虚拟机与容器对比&#xff1a; 2、Hypervisor管理工具对比&#xff1a; 3、QEMU&#xff1a; 软件模拟虚拟化、可以模拟多种硬件&#xff0c;包括X86架构处理器、AMD64架构处理器、ARM、SPARC与PowerPC、AIX架构等&#xff0c;效率低、一般用于研究测试场景。QEMU可以模拟一…

偏微分题目的解法

介绍偏微分是考研数学里的小重点&#xff0c;通常在题干中就能很明显看到偏导数。这种题目一般会有两个小题&#xff0c;且第一题往往送分题&#xff0c;通常是求某个复合函数的偏导&#xff0c;直接用复合函数的求导法则即可得到答案。第二题通常是求原函数&#xff0c;一般来…

NVIDIA 在 WeNet 中开源 Noisy Student Training 方案

为了改进 Noisy Student Training 在非目标领域 ASR 上的性能&#xff0c;英伟达提出新型数据筛选方法 LM Filter。其利用不同解码方式的识别文本之间的差异来作为数据筛选条件&#xff0c;是一个完全无监督的筛选过程。在 AIShell-1 上与无数据筛选的基线相比可以有 10.4% 的性…

PYNQ-Z2 开发板

1. 官方手册写的挺全&#xff0c;了解一下PYNQ-Z2 设置指南 https://pynq.readthedocs.io/en/latest/getting_started/pynq_z2_setup.htmlPYNQ-Z2 Reference Manual v1.0 https://www.mouser.com/datasheet/2/744/pynqz2_user_manual_v1_0-1525725.pdfpynq&#xff08;Python O…

单分散PEG之Amino-PEG24-acid;CAS:196936-04-6氨基-二十四聚乙二醇-羧酸

Amino-PEG24-acid氨基-二十四聚乙二醇-羧酸196936-04-6 中文名称&#xff1a;氨基-二十四聚乙二醇-羧酸 英文名称&#xff1a;Amino-PEG24-acid 分子式&#xff1a;C51H103NO26 分子量&#xff1a;1146.35 CAS&#xff1a;196936-04-6 外观&#xff1a;粘稠液体或者固体粉末&a…

数据的存储(3)浮点数的存储

tips 1. 2. 浮点数内存存储方式与整型是截然不同&#xff0c;不可被整型思维带偏了 我用一个例子来理解浮点数在内存当中的表示方法&#xff0c;先上一个十进制浮点数13.5 1. 利用二进制的权重化为二进制浮点数 二进制权重表小数部分如下&#xff1a; 那么13.5&…

Vue好难理解怎么办?

Vue学习笔记分享给你&#xff0c;希望对你有些帮助&#xff0c;另外推荐2个安装 VScode 中的 Vue 插件 Vue 3 Snippets Vue 3 Snippets - Visual Studio Marketplace 这个插件包含了所有的 Vue.js 2 和 Vue.js 3 的 api 对应的代码片段。插件的代码片段如下表格所示&#xff0…

Jetson nano 入手系列之4—外围设备:开机键+PWM风扇

Jetson nano 入手系列之4—外围设备&#xff1a;开机键PWM风扇1.外接按键开机2.PWM可调速风扇2.1 jtop工具2.2 PWM风扇2.3 PWM风扇的控制2.3.1 手动控制2.3.2 自动控制参考文献本系列针对亚博科技jetson nano开发板。 Jetson nano 入手系列&#xff1a; Jetson nano 入手系列之…

《MySQL系列-InnoDB引擎11》InnoDB关键特性-刷新邻接页

InnoDB 关键特性 InnoDB存储引擎的关键特性包括&#xff1a; Insert Buffer (插入缓冲)Double Write (两次写)Adaptive Hash Index (自适应哈希索引)Async IO (异步IO)Flush Neighbor Page (刷新领接页) 这些特性为InnoDB存储引擎带来了更好的性能以及更高的可靠性。 刷新邻接…

极光笔记 | 当前最佳实践:Header Bidding 与瀑布流混合请求技术

通过这篇文章您讲将了解&#xff1a;Header Bidding 的发展史Waterfall、Header Bidding 的逻辑及优劣势为什么说 Header Bidding 与瀑布流混合请求技术是当前最佳实践PART 01、Header Bidding 的起源Header Bidding&#xff08;头部竞价&#xff0c;又称 Pre-Bidding 或 Advan…

PaddleSports:“AI+体育”端到端开发套件及落地实践

本系列根据WAVE SUMMIT2022深度学习开发者峰会「开源开放 生态共建」论坛嘉宾分享整理。本文整理自「开源开放 生态共建」百度研究院的资深研究员卢飞翔的主题演讲——PaddleSports&#xff1a;“AI体育”端到端开发套件及落地实践。百度3DAI智慧体育团队针对数据、算法、产品三…

C++语法基础课 习题5 —— 字符串

文章目录例题1. 760.字符串的长度(fgets函数)重点&#xff01;2. 761.字符串中数字的个数3. 763.循环相克令4. 765.字符串加空格(getline函数auto用法)重点&#xff01;5. 769.替换字符 重点&#xff01;6. 773.字符串的插入(substr函数)重点!7. 772.只出现一次的字符(难题)习题…

Python逆向进阶教程笔记(1)

视频地址&#xff1a;Day1初识JS逆向 混淆与无混淆数据加密方案解析实战-36Kr数据加密解析 (AES数据逆向)_哔哩哔哩_bilibili 未完待续 一、排错 1.1&#xff09; 目的&#xff1a;抓页面借口&#xff0c;简单请求会被拦截 1.2&#xff09; 网址&#xff1a;乌海市公共资源…

OSPF-MGRE实验(1.3)

要求&#xff1a; 1、首先为每个路由器配置接口ip和环回ip实现第一个目标 r1&#xff1a; [r1]interface GigabitEthernet 0/0/0 [r1-GigabitEthernet0/0/0]ip add 16.1.1.1 24 [r1-GigabitEthernet0/0/0]int gi0/0/1 [r1-GigabitEthernet0/0/1]ip add 61.1.1.1 24 [r1-Gigab…

java File类详细

目录 File创建 1.File&#xff08;String pathname&#xff09; 2. File&#xff08;String parent,String child&#xff09; 3.File(File f,String child) file类的使用 基本操作&#xff1a; 文件夹的操作 File创建 1.File&#xff08;String pathname&#xff09; …

一起快速了解单片机入门知识吧!

从事计算机和电子信息技术行业的都熟知单片机一词&#xff0c;但是你真的了解单片机吗&#xff1f;单片机的种类有哪些&#xff1f;单片机有什么特点&#xff1f;单片机的工作原理是什么&#xff1f;下面一起来了解单片机知识吧&#xff01;在学习单片机知识前&#xff0c;我们…

多数据库学习之SQL Server查询表自增主键字段信息SQL

多数据库学习之SQL Server查询表自增主键字段信息SQL前言概念SQL样例方式一&#xff1a;系统内置存储过程查找方式二&#xff1a;通过INFORMATION_SCHEMA模式下系统视图获取方式三&#xff1a;通过sys模式下系统视图获取参考链接前言 Microsoft SQL Server简介 Microsoft SQL S…

Zookeeper详解(三)——开源客户端curator

开源客户端curator (true re de) curator是Netflix公司开源的一个zookeeper客户端&#xff0c;后捐献给apache&#xff0c;curator框架在zookeeper原生API接口上进行了包装&#xff0c;解决了很多zooKeeper客户端非常底层的细节开发。提供zooKeeper各种应用场景(比如&#xf…

CSS3 动画案例

文章目录变形效果案例照片墙过渡效果案例鼠标移动显示内容图片文字滑动效果白光闪过效果手风琴效果动画案例脉冲动画loading效果灯光闪烁动画代码变形效果案例 照片墙 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>&…

ESP IDF:观察者Observer用例实现

ESP IDF:观察者 Observer用例实现 #include <stdio.h> // #include #include // using namespace std; //抽象的英雄 抽象的观察者 Observer class AbstractHero { public: virtual void Update() 0; }; std::list<AbstractHero*> mlist; std::list<Abstr…