node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)

yizhihongxing

下面是详细的攻略:

准备工作

在进行下一步操作前,请确保你已经安装好了以下软件:

  • Node.js
  • MySQL数据库

同时,在项目目录下创建一个 .env 文件,用于存储私密信息。文件格式如下:

PORT=3000
SECRET=your_secret_key
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=your_database_name

这里需要注意,其中的 SECRET 字段用于指定加密 cookie 的密钥,应当使用一个难以猜测的字符串进行设置。

配置数据库

在 MySQL 中创建一个数据库,然后在数据库中创建一张名为 users 的表,用来存储登录用户的信息。表的结构如下:

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(255) NOT NULL UNIQUE,
  password CHAR(60) NOT NULL
);

在该表中插入一条测试数据:

INSERT INTO users (username, password) VALUES ('test', '$2a$10$mqFy1PDYDt3bREqk7vSdOOZHZ5c.6VVBchAxQoWzABNGyZzWkY2/q');

其中,密码字段使用了 bcrypt 加密算法,用于保障用户密码的安全性。

编写代码

安装依赖

在项目根目录下执行以下命令,安装依赖:

npm install express express-session ejs mysql2 bcrypt cookie-parser dotenv

创建 Express 应用

在项目根目录下创建一个名为 app.js 的文件,并编写如下代码:

const express = require('express');
const session = require('express-session');
const ejs = require('ejs');
const mysql = require('mysql2/promise');
const bcrypt = require('bcrypt');
const cookieParser = require('cookie-parser');
const dotenv = require('dotenv');

const app = express();
dotenv.config();

app.set('view engine', 'ejs');

app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(session({
  secret: process.env.SECRET,
  resave: false,
  saveUninitialized: false
}));

const pool = mysql.createPool({
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME
});

app.get('/', (req, res) => {
  res.render('index', { user: req.session.user });
});

app.get('/login', (req, res) => {
  res.render('login');
});

app.post('/login', async (req, res) => {
  const { username, password, remember } = req.body;
  const conn = await pool.getConnection();
  const [ rows ] = await conn.query('SELECT * FROM users WHERE username = ?', [ username ]);
  conn.release();

  if (rows.length === 0) {
    return res.render('login', { error: '用户名或密码不正确' });
  }

  const user = rows[0];

  if (!bcrypt.compareSync(password, user.password)) {
    return res.render('login', { error: '用户名或密码不正确' });
  }

  req.session.user = user;

  if (remember) {
    res.cookie('remember', user.username, { maxAge: 7 * 24 * 3600 * 1000 });
  } else {
    res.clearCookie('remember');
  }

  return res.redirect('/');
});

app.get('/logout', (req, res) => {
  req.session.destroy();
  res.redirect('/');
});

app.listen(process.env.PORT, () => {
  console.log(`Server is running on port ${process.env.PORT}`);
});

创建模板文件

在项目根目录下创建一个名为 views 的文件夹,在其中创建 index.ejslogin.ejs 两个文件,分别用于展示首页和登录页面。模板文件的内容如下:

index.ejs

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Node.js+MySQL记住密码登陆示例</title>
</head>
<body>
  <% if (user) { %>
    <p>当前已登录为 <%= user.username %> <a href="/logout">退出</a></p>
  <% } else { %>
    <p>当前未登录 <a href="/login">点击此处登录</a></p>
  <% } %>
</body>
</html>

login.ejs

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>登录</title>
</head>
<body>
  <% if (error) { %>
    <p style="color: red;"><%= error %></p>
  <% } %>
  <form method="post">
    <div>
      <label for="username">用户名:</label>
      <input type="text" name="username" id="username">
    </div>
    <div>
      <label for="password">密码:</label>
      <input type="password" name="password" id="password">
    </div>
    <div>
      <label for="remember">记住密码:</label>
      <input type="checkbox" name="remember" id="remember" value="1">
    </div>
    <button type="submit">登录</button>
  </form>
</body>
</html>

分析代码

以上代码使用了 express 框架,同时使用了 express-sessionmysql2bcryptcookie-parserdotenv 四个中间件库。

其中,express-session 库用于处理会话信息,mysql2 库用于连接和操作 MySQL 数据库,bcrypt 库用于密码加密,cookie-parser 库用于解析 cookie,dotenv 库用于读取 .env 文件中的配置信息。

在代码中,我们通过 app.use 方法将这些中间件注册到了 Express 应用中,使其生效。

/login 路由处理函数中,我们取得了表单中提交的用户名和密码,并使用 bcrypt 库中的 compareSync 方法将其和数据库中的用户密码进行比较。如果密码匹配成功,则将用户信息存储到会话中,并根据用户是否勾选了“记住密码”选项来设置 cookie。

/logout 路由处理函数中,我们使用 req.session.destroy 方法销毁了会话信息。

在模板文件中,我们使用了 EJS 模板引擎,根据用户的登录状态动态展示不同的内容。

示例说明

示例 1:记住密码

当用户在登录页面勾选了“记住密码”选项并成功登录后,服务器会向客户端发送一个名为 remember 的 cookie,有效期为 7 天。这样,当用户在下次访问网站时,客户端会自动携带该 cookie,服务器就可以根据其内容自动登录用户。

示例 2:退出登录

当用户在访问站点时,若发现客户端携带了正确的 session 数据,会展示出“当前已登录为 XXX 退出”按钮,当用户点击了退出时,服务器会调用 req.session.destroy 方法,销毁当前 session 中的数据,客户端的状态也会及时清除。因此,当用户再次访问时,应当重新登录,无法直接进入已登录状态。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql) - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • nodejs dgram模块广播+组播的实现示例

    下面就为大家详细介绍如何使用nodejs的dgram模块进行广播和组播的实现,包括示例说明。 什么是dgram模块? dgram 提供了实现 UDP 数据包 socket 的方式,它是 Node.js 标准库的一部分,用于处理网络数据通信。 广播和组播的概念 广播是指向同一广播网络内的所有网络设备传输消息的过程。广播的特点是传送迅速,但由于是向所有设备广播,…

    node js 2023年6月8日
    00
  • Node.js进程退出的深入理解

    Node.js进程退出的深入理解 Node.js进程退出是一个非常重要的问题,在应用程序开发中经常会遇到各种问题,例如应用程序崩溃、进程无法退出等等,所以我们需要深入理解Node.js进程退出的原理及技巧,以避免这些问题的发生。 Node.js进程退出的原理 在Node.js中,进程的退出分为两种情况: 程序正常退出 程序异常退出 在程序正常退出的情况下,可…

    node js 2023年6月8日
    00
  • Node.js API详解之 os模块用法实例分析

    Node.js API详解之 os模块用法实例分析 简介 Node.js是一款基于Chrome V8引擎的JavaScript开发的服务器端运行环境,提供了许多实用的内置模块,其中os模块是其中之一。 os模块提供了与操作系统相关的一些方法,例如获取系统信息、处理文件路径、获取CPU和内存相关信息等。 应用方法 1. os.arch() os.arch()方…

    node js 2023年6月8日
    00
  • ES10 特性的完整指南小结

    ES10 特性的完整指南小结 ECMAScript 2019 (ES10) 是Javascript的第十代标准,为Javascript增加了一些新的特性和语法。本文将对ES10的主要新增特性进行介绍。 Array.prototype.flat() Array.prototype.flat() 方法可以将一个多维数组变成一个一维数组。它接收一个可选参数dept…

    node js 2023年6月8日
    00
  • 手把手教你VSCode配置JavaScript基于Node.js的调试环境

    手把手教你VSCode配置JavaScript基于Node.js的调试环境 简介 Visual Studio Code(以下简称“VSCode”)是一款优秀的文本编辑器,因其强大的插件生态系统、良好的性能和简便的操作流程而受到广泛欢迎。本文将向你介绍如何在VSCode下配置JavaScript基于Node.js的调试环境。 环境准备 在开始配置调试环境之前,…

    node js 2023年6月8日
    00
  • koa源码中promise的解读

    下面是关于“koa源码中promise的解读”的完整攻略: 1. koa中的Promise koa是一个基于Node.js平台的下一代web开发框架,它实现了ES6中的async/await, 而async/await依赖于Promise。因此在koa中,Promise是一个非常重要的概念。 在koa的实现中,Promise主要用于解决异步回调嵌套的问题,通…

    node js 2023年6月8日
    00
  • Node.js模块封装及使用方法

    Node.js是一个基于Chrome V8引擎构建的开源Javascript运行环境,它能够使Javascript代码运行在服务器端,并通过模块化的方式组织代码。Node.js的模块化机制非常强大,允许用户将代码封装为一个模块,并将其暴露给其他模块以便使用。接下来,本文将为您详细讲解Node.js模块的封装及使用方法。 Node.js 模块的封装 在Node…

    node js 2023年6月8日
    00
  • Centos7 中安装 Node.js v4.4.4

    下面是“Centos7中安装Node.js v4.4.4”的完整攻略: 确认系统版本 在安装Node.js之前,需要确认操作系统版本是否为Centos7。可以在终端中输入以下命令查看: cat /etc/centos-release 如果版本为Centos7,继续进行下一步操作。 安装必要的依赖 在安装Node.js之前,需要先安装一些必要的依赖,以确保No…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部