Node写博客--用户登录和用cookie保存用户登录状态

2023-11-13

1.首先在index.js中加入用户登录的ajax数据传输

 //登录
    $loginBox.find('button').on('click',function () {
        //通过ajax提交请求
        $.ajax({
            type:'post',
            url:'/api/user/login',
            data:{
                username:$loginBox.find('[name="username"]').val(),
                password:$loginBox.find('[name="password"]').val(),
            },
            datatype:'json',
            success:function (result) {
                 if(!result.code){
                    //登录成功
                    setTimeout(function(){
                        $loginBox.hide();
                        $userInfo.show();
                    },1000);
                }
            }
        })
    })

2.在api.js中加入登录路由

//登录
router.post('/user/login',function (req,res) {//新增路由
    var username=req.body.username;
    var password=req.body.password;

    if(username == ''|| password==''){
        responseData.code=1;
        responseData.message='用户名和密码不能为空';
        res.json(responseData);
        return;
    }
    //查询数据库中相同用户名和密码的记录是否存在,如果存在则登录成功
    User.findOne({
        username:username,
        password:password
    }).then(function (userInfo) {
        if(!userInfo){
            responseData.code=2;
            responseData.message='用户名或密码错误';
            res.json(responseData);
            return;
        }
        //用户名和密码是正确的
        responseData.message='登录成功';
        responseData.userInfo={
            _id:userInfo._id,
            username:userInfo.username
        }
        res.json(responseData);
        return;
    });
});

补充:index.html页面中登录,注册,已登录的页面情况

<div class="mainRight">


        <div class="rightBox" id="userInfo" style="display:none;">
            <div class="title"><span>用户信息</span></div>
            <p><span class="colDark username">admin</span></p>

            <p><span class="colDanger info">你好,你是管理员,<a href="/admin">你可以点击这里进入管理</a></span></p>

            <p><span class="colDark logout"><a href="javascript:;">退出</a></span></p>
        </div>

        <div class="rightBox" id="loginBox" style="display:none;">
            <div class="title"><span>登录</span></div>
            <div class="line"><span class="colDark">用户名:</span><input name="username" type="text" /><em></em></div>
            <div class="line"><span class="colDark">密码:</span><input name="password" type="password" /><em></em></div>
            <div class="line"><span class="colDark"></span><button>登 录</button></div>
            <p class="textRight">还没注册?<a href="javascript:;" class="colMint">马上注册</a> </p>
            <p class="colWarning textCenter"></p>
        </div>

        <div class="rightBox" id="registerBox" >
            <div class="title"><span>注册</span></div>
            <div class="line"><span class="colDark">用户名:</span><input name="username" type="text" /></div>
            <div class="line"><span class="colDark">密码:</span><input name="password" type="password" /></div>
            <div class="line"><span class="colDark">确认:</span><input name="repassword" type="password" /></div>
            <div class="line"><span class="colDark"></span><button>注 册</button></div>
            <p class="textRight">已有账号?<a href="javascript:;" class="colMint">马上登录</a> </p>
            <p class="colWarning textCenter"></p>
        </div>


        <div class="rightBox">
            <div class="title"><span>社区</span></div>
            <p><a href="http://www.miaov.com" target="_blank" class="colDanger">妙味课堂</a></p>
            <p><a href="http://bbs.miaov.com" target="_blank" class="colDanger">妙味茶馆</a></p>
        </div>
    </div>

3.在index.js中

var $userInfo = $('#userInfo');//获得登录以后页面

4.用户成功登录以后,要显示html中userInfo页面

在index.html中修改成如下

<div class="rightBox" id="userInfo" style="display:none;">
            <div class="title"><span>用户信息</span></div>
            <p><span class="colDark username"></span></p>

            <p><span class="colDanger info"></span></p>

            <p><span class="colDark logout"><a href="javascript:;">退出</a></span></p>
        </div>

在index.js中修改

//登录
    $loginBox.find('button').on('click',function () {
        //通过ajax提交请求
        $.ajax({
            type:'post',
            url:'/api/user/login',
            data:{
                username:$loginBox.find('[name="username"]').val(),
                password:$loginBox.find('[name="password"]').val(),
            },
            datatype:'json',
            success:function (result) {
                //提示信息
                $loginBox.find('.colWarning').html(result.message);
                if(!result.code){
                    //登录成功
                    setTimeout(function(){
                        $loginBox.hide();
                        $userInfo.show();
                        //显示登录用户的信息
                        $userInfo.find('.username').html(result.userInfo.username);
                        $userInfo.find('.info').html('你好,欢迎光临我的博客');
                    },1000);
                }
            }
        })
    })

5.用户登录成功以后,但是当我们刷新页面的时候,就退出登录状态了,我们需要运用cookie记录用户登录状态

(1) 在app.js中引入cookie模块

//加载cookie模块
var cookies = require('cookies');
//对cookie进行相关设置
app.use(function (req,res,next) {
    req.cookies = new Cookies(req,res);
    next(); //不要忘记
});

(2)在api.js的登录路由中,不仅要返回页面信息,也需要发送一个cookie

//用户名和密码是正确的
        responseData.message='登录成功';
        responseData.userInfo={
            _id:userInfo._id,
            username:userInfo.username
        }
        req.cookies.set('userInfo',JSON.stringify({
            _id:userInfo._id,
            username:userInfo.username
        }));
        res.json(responseData);
        return;

(3)发现完成以后,信息头里面已经有了cookie信息,但是页面刷新的时候,仍然不能保持登录

在app.js中,将cookie的进行如下修改

//对cookie进行相关设置
app.use(function (req,res,next) {
    req.cookies = new Cookies(req,res);
    //设置一个全局访问的页面,解析用户登录的cookie信息
    req.userInfo={};
    if(req.cookies.get('userInfo')){
        try{
            req.userInfo=JSON.parse(req.cookies.get('userInfo'));
        }catch (e){}
    }
    next();
});

在模板main.js中,分配模板

var express = require('express');
var router =express.Router();
router.get('/',function(req,res,next) {
    res.render('main/index',{ //第二个参数分配模板
        userInfo:req.userInfo
    });//渲染当前views下面的index.html页面

});

module.exports = router;

在index.html中进行判断分析

{% if userInfo._id %} <!--模板语言-->
       <div class="rightBox" id="userInfo">
            <div class="title"><span>用户信息</span></div>
            <p><span class="colDark username">{{userInfo.username}}</span></p>

            <p><span class="colDanger info">你好,欢迎光临我的博客!</span></p>

            <p><span class="colDark logout"><a href="javascript:;">退出</a></span></p>
        </div>
        {% else %}
        <div class="rightBox" id="loginBox" style="display:none;">
            <div class="title"><span>登录</span></div>
            <div class="line"><span class="colDark">用户名:</span><input name="username" type="text" /><em></em></div>
            <div class="line"><span class="colDark">密码:</span><input name="password" type="password" /><em></em></div>
            <div class="line"><span class="colDark"></span><button>登 录</button></div>
            <p class="textRight">还没注册?<a href="javascript:;" class="colMint">马上注册</a> </p>
            <p class="colWarning textCenter"></p>
        </div>

        <div class="rightBox" id="registerBox" >
            <div class="title"><span>注册</span></div>
            <div class="line"><span class="colDark">用户名:</span><input name="username" type="text" /></div>
            <div class="line"><span class="colDark">密码:</span><input name="password" type="password" /></div>
            <div class="line"><span class="colDark">确认:</span><input name="repassword" type="password" /></div>
            <div class="line"><span class="colDark"></span><button>注 册</button></div>
            <p class="textRight">已有账号?<a href="javascript:;" class="colMint">马上登录</a> </p>
            <p class="colWarning textCenter"></p>
        </div>
        {% endif %}

(4)在登录成功,以后就不需要在index.js中将页面隐藏,只需要刷新页面即可

//登录
    $loginBox.find('button').on('click',function () {
        //通过ajax提交请求
        $.ajax({
            type:'post',
            url:'/api/user/login',
            data:{
                username:$loginBox.find('[name="username"]').val(),
                password:$loginBox.find('[name="password"]').val(),
            },
            datatype:'json',
            success:function (result) {
                //提示信息
                $loginBox.find('.colWarning').html(result.message);
                if(!result.code){
                    //登录成功
                    // setTimeout(function(){
                    //     $loginBox.hide();
                    //     $userInfo.show();
                    //     //显示登录用户的信息
                    //     $userInfo.find('.username').html(result.userInfo.username);
                    //     $userInfo.find('.info').html('你好,欢迎光临我的博客');
                    // },1000);
                    window.location.reload();
                }
            }
        })
    })

6.用户退出,

(1)index.html中

<p><span class="colDark"><a href="javascript:;" id="logout">退出</a></span></p>

(2)在index.js中,增加退出路由

//退出
    $('#logout').on('click',function () {
        $.ajax({
            url:'/api/user/logout',
            success:function (result) {
                if(!result.code){
                    window.location.reload();
                }
            }
        })
    })

(3)在api.js中

//退出
router.get('/user/logout',function (reqres) {
    req.cookies.set('userInfo',null);
    res.json(responseData);
})

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node写博客--用户登录和用cookie保存用户登录状态 的相关文章

  • PCB对点之Mark点检测

    一 Mark点的作用 Mark点是电路板设计中PCB应用于自动贴片机上的位置识别点 Mark点标记可以是裸铜 清澈的防氧化涂层保护的裸铜 PCB板Mark点也叫基准点 为表面贴装工艺中的所有步骤提供共同的可测量点 保证了SMT设备能精确的定
  • 【MySQL】如何导入SQL数据库

    目录 如何导入SQL数据库 例子1 以Terminal终端命令行导入 例子2 以SQLyog图形化软件导入 如何导入SQL数据库 如何将现成的数据库导入到MySQL中 有两种方式 通过终端命令行语句导入 mysql gt source SQ
  • 51单片机入学第五课——蜂鸣器的原理与应用

    文章目录 三极管 三极管的应用 三极管工作原理 PNP型 NPN型 蜂鸣器工作原理 电路分析 编程实践 总结 三极管 三极管两种封装方式 三极管的应用 三极管 全称应为半导体三极管 也称双极型晶体管 晶体三极管 是一种控制电流的半导体器件
  • cookie记录了服务器相关的信息,使用cookie记录信息(精选).ppt

    文档介绍 第6章使用cookie记录信息 1 6 1 1 什么是cookie 什么是Cookies 小甜饼 Cookies就是服务器暂存放在你的电脑里的资料 txt格式的文本文件 好让服务器用来辨认你的计算机 当浏览网站的时候 Web服务器
  • DDR3 关键时间参数

    1 传输速率 比如 1066MT S 1600MT S 1866MT S 等 这个是首要考虑的 因为这个决定了 DDR3 内存的最高传输速率 2 tRCD 参数 tRCD 全称是 RAS to CAS Delay 也就是行寻址到列寻址之间的
  • 《Learning Spark》第十一章:Spark(MLlib)与机器学习

    2020 07 06 引言 我一直以为这部分内容 其实没有什么大不了的 反正就是弄出来数据 然后跑算法就完事了嘛 但是仔细读了读这小节 发现了一些不一样的地方 这里来列举一下 我读完这个章节之后的一些想法 然后再具体来记录这部分的主要内容
  • 计算机组成原理 总线与微命令实验

    总线与微命令实验 实验环境 计算机组成原理实验环境 实验目的 理解总线的概念和作用 连接运算器与存储器 熟悉计算机的数据通路 理解微命令与微操作的概念 实验要求 做好实验预习 读懂实验电路图 熟悉实验元器件的功能特性和使用方法 按照实验内容
  • 手把手教你阅读开源代码【附Python开源项目包】

    文末领取 Python开源项目包 1 为什么要阅读开源代码 阅读 Python 开源项目代码主要有如下三个原因 在工作过程中遇到一些问题 Google 和 StackOverFlow 等网站找不到解决办法 只能去翻源码 对某些项目或者方向非
  • VS2010 error LNK2019: unresolved external symbol _WinMain

    MSVCRTD lib crtexew obj error LNK2019 unresolved external symbol WinMain 16 referenced in funct 本来应该是console application
  • 用C写小游戏(扫雷)

    扫雷 前言 实现的基本要素 菜单 雷区设置与打印 1 雷区 2 布置雷 3 打印雷区 雷范围标识与排雷 1 雷范围标识 2 排雷 代码展示 前言 说到扫雷大家都不陌生吧 特别是windowsXP开始的菜单中找到的小游戏中最吸引我们的便是扫雷
  • coroutines 学习随笔「一」

    文章目录 前言 疑问1 为啥用协程还要添加一个额外的依赖库 太奇怪了 我的runBlocking launch withContext 等等都哪去了 跟踪到标准库去看看 从现在开始进入到标准库了 下个小结论 this is BaseCont
  • 猿创征文|深聊MySQL,从入门到入坟之:应该是全网最详细的MySQL知识点汇总,必须收藏。

    MySQL详细知识点汇总 1 引言 2 MySQL知识点汇总 2 1 链接与断开 2 2 启动与创建服务 2 3 数据库操作 2 4 表操作 2 5 数据操作 2 6 字符集编码 2 7 数据类型 2 7 1 数值类型 2 7 2 字符串类
  • multipart/form-data的使用注意

    问题描述 事情是这样的 我在使用ajax FormData对象提交数据的时候 使用request setRequestHeader Content Type application x www form urlencoded 但服务端接受的
  • 用ACL实现防火墙功能

    目录 一 实验目的 二 实验环境 三 实验内容 实验步骤 测试数据等 1 打开Cisco Packet Tracer 6 0 按以下拓扑图接好线路 PC与Server的IP地址 掩码 网关配置 路由器连接配置 2 配置好设备的IP地址和静态
  • Java线程的5种状态及状态之间转换

    Java中的线程的生命周期大体可分为5种状态 1 新建 NEW 新创建了一个线程对象 2 可运行 RUNNABLE 线程对象创建后 其他线程 比如main线程 调用了该对象的start 方法 该状态的线程位于可运行线程池中 等待被线程调度选
  • 笔记/OSI七层模型

    层级 名称 功能 协议 设备 协议数据单元 7 应用层 为应用程序提供网络服务 对应用程序提供接口 HTTP 80 TCP 超文本传输 Telnet 23 TCP 远程登陆 FTP 20 21 TCP 文件传输 SMTP 25 TCP 简单
  • AD器件距离过近报错 AD修改丝印的距离间距

    今天画板子遇见了一个间距报错 图片如下 我当时想着 修改丝印的间距就可以了 查找了一些资料之后发现是这样修改 并且我将其修改到了0 但是结果还是如上图一样 报错 最后发现除此之外 我们还需要修改元件之间的电气距离 修改完成之后就OK
  • Thinkpad笔记本快捷键大全

    Thinkpad笔记本快捷键大全 FN F2 锁定屏幕 FN F3 关闭屏幕 FN F4 待机 FN F5 无线和蓝牙开关 FN F7 不同显示设备输出切换 FN F9 安全删除硬件 FN F12 休眠 FN 空格 放大 其实就是降低分辨率

随机推荐

  • JackSonUtil JSONArray转换工具

    import com fasterxml jackson core type TypeReference import com fasterxml jackson databind ObjectMapper public final cla
  • Ubuntu安装nginx到配置ssl证书

    1 命令安装nginx sudo apt get install nginx 配置文件默认在 etc nginx文件夹下面 可以编辑nginx conf 或者 sites enabled文件夹下面的默认配置文件 default 2 常用命令
  • linux定时删除文件或文件夹

    本文转载自 https blog csdn net jiangnan8710 article details 51849748 linux新人 个人记录以后备用 一 常用的命令 1 查询命令 find 在删除日志前 首先要做的是查找日志所在
  • dos命令之md详解及实例应用

    dos命令之md详解及实例应用 用来创建文件夹dos的命令只有md 其英文解释为 makedirectory在windows2000 xp vista win7使用方法及实例如下 在命令行窗口输入md 可得到一份帮助信息如下图 例1 如果在
  • python爬取整个网站的广告敏感词_Python实现敏感词过滤的4种方法

    在我们生活中的一些场合经常会有一些不该出现的敏感词 我们通常会使用 去屏蔽它 例如 尼玛 gt 一些骂人的敏感词和一些政治敏感词都不应该出现在一些公共场合中 这个时候我们就需要一定的手段去屏蔽这些敏感词 下面我来介绍一些简单版本的敏感词屏蔽
  • 全国首富排行居然有他?用Python采集全国富豪榜五百名。

    背景 今天刷到一则文章 就是国内某富豪花重金迎娶泰国某 皇后 可谓是有点颠覆了我的三观啊 有钱人都玩的这么花的吗 这里内容就不一一讲了 毕竟看咱文章的都是想来学技术的 那就废话不多说 开始干活 正文 相关模块 今天不用其他的什么模块 pyt
  • linux系统使用rsync做主备服务器文件同步

    根据本文档设置 可以实现备机自动同步主机中的文件 注意 此方式缺陷为 如果主机文件修改 但是文件大小无变化或者文件变小时 无法自动同步到备机中 只有主机中文件修改后变大或者名称修改才能自动同步 一 LINUX服务器间免密登录设置 先执行 u
  • Scaling Instruction-Finetuned Language Models

    Paper name Scaling Instruction Finetuned Language Models Paper Reading Note Paper URL https arxiv org pdf 2210 11416 pdf
  • 【NLP】pkuseg:一个多领域中文分词工具包

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 软考-嵌入式系统设计师-笔记:标准化知识

    文章目录 国际标准 国家标准 行业标准 企业标准基本知识 嵌入式系统相关标准 国际标准 国家标准 行业标准 企业标准基本知识 国际标准 有效期5年 ISO 标准号 杠 分标准号 冒号 发布年号 方括号中的内容可有可无 国家标准 GB 中国
  • Python爬取携程酒店信息

    代码 from selenium import webdriver from time import sleep import xlwt 进行excel操作 谷歌驱动 告诉电脑在哪打开浏览器 driver webdriver Chrome
  • cloudflare tunnel搭建网站

    文章目录 0 写在开头 1 一些准备工作 2 Cloudflare Tunnel 3 最后 0 写在开头 如果你刚接触web项目 想让你的项目部署在公网上 但只是兴趣使然 并不打算花费金钱长期运行 或许本博客对你会有所帮助 1 一些准备工作
  • Cookie和Session 登录

    Cookie 实现免登陆和Session 01 需求说明 完成用户登录功能 登录成功后跳到成功页面 显示用户名 登录失败可以跳回登录页面 登录成功后后续操作均能显示当前登录的用户名 02 完成代码 DologinServlet java O
  • 数据挖掘实验-week8-关联规则挖掘(Association Rule Mining)

    Contents 0 引言 0 1 关联规则挖掘 0 2 Apriori算法 实验 Step 1 Familiarize yourself with the arules package in R 1 1 Load the package
  • python如何输出数字后三位

    想要输出数字的后三位 首先需要了解一些基础知识 在Python中 浮点数可以用round 函数来保留小数位数 这个函数有两个参数 要操作的数字和要保留的小数位数 例如 round 3 1415926 3 将返回3 142 其中第二个参数3表
  • Electron+Vue3+TypeScript+Vite +Vue.Draggable 完成事务拖动

    原文地址 Electron Vue3 TypeScript Vite Vue Draggable 完成事务拖动 前言 有了简单的框架 下面来点实际业务相关的操作吧 集成 Vue Draggable 将每一项任务拖拽任务到每个分类吧 Vue
  • Java连接MySQL数据库并实现增删改查

    首先我们需要连接数据库 我这里选择的是MySQL数据库 我们需要做的第一件事就是加载驱动 采用下列语句加载MySQL驱动 Class forName com mysql jdbc Driver 驱动加载成功后就可以创建连接对象 这里会使用到
  • 斐波那契数列计算 Python编程

    问题描述 斐波那契数列如下 F 0 0 F 1 1 F n F n 1 F n 2 编写一个计算斐波那契数列的函数 采用递归方式 输出不超过n的所有斐波那契数列元素 调用上述函数 完成如下功能 用户输入一个整数n 输出所有不超过n的斐波那契
  • Markdown表格实现合并单元格

    Markdown表格实现合并单元格 markdown基本语法的表格没有办法实现合并单元格功能 但是在实际使用中很多时候需要合并单元格 例如需要写一个这样非连续的寄存器说明 markdown语法的表格 参数 额定值 最大结温 150 C DV
  • Node写博客--用户登录和用cookie保存用户登录状态

    1 首先在index js中加入用户登录的ajax数据传输 登录 loginBox find button on click function 通过ajax提交请求 ajax type post url api user login dat