Express + Session 实现登录验证功能

以下是详细的“Express + Session 实现登录验证功能”的完整攻略。

什么是 Session

Session 是用来存储用户与 web 服务器交互过程中产生的数据的一种机制。当用户访问 web 服务器时,服务器会生成一个 Session ID,用来标识用户的身份信息,将其发送给客户端,客户端在访问服务器时带上这个 Session ID,服务器根据 Session ID 来识别用户的身份。一般来说,Session 数据存储于服务器的内存或者数据库中。

Express 中使用 Session

Express 通过 express-session 模块来实现 Session 的功能。下面,我们来讲解如何在 Express 中使用 Session 实现登录验证功能。

首先,需要使用 npm install express-session 命令来安装 express-session 模块。

接着,在使用了 body-parser 进行 post 请求的中间件之后,需要添加 Session 的中间件:

var express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session'); // 引入 Session 模块

// 创建服务器应用程序
var app = express();

app.use(bodyParser.urlencoded({ extended: false }));

// 添加 Session 的中间件
app.use(session({
  secret: 'secret key',
  resave: false,
  saveUninitialized: true
}));

// 路由设置

上述代码中,创建了 app 应用程序,使用了 body-parser 中间件,然后使用 app.use() 方法添加了 Session 中间件。下面,我们来详细说明各个参数的含义:

  • secret: Session 的密钥,用于加密 Session ID。该参数的值可以是一个字符串或一个数组,如果是数组,可以设置多个密钥,这样可以增加 Session 的安全性。
  • resave: 强制保存 Session,即使 Session 没有被修改,也要重新保存。建议将其设置为 false,以避免 Session 被频繁保存。(但是,如果使用了监视文件系统的 Session 存储,则建议将其设置为 true
  • saveUninitialized: 强制将未初始化的 Session 存储。建议将其设置为 true,以避免 Session 无故被删除。

在添加了 Session 的中间件之后,我们就可以使用 req.session 对象访问 Session 中存储的数据了。下面,我们设置一个用于登录验证的路由:

app.post('/login', function(req, res) {
  var username = req.body.username;
  var password = req.body.password;

  // 省略用户名密码的验证过程

  // 将用户信息存储到 Session 中
  req.session.user = {
    username: username
  };

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

app.get('/', function(req, res) {
  if (req.session.user) {
    res.send('Hello, ' + req.session.user.username + '!');
  } else {
    res.redirect('/login');
  }
});

app.get('/login', function(req, res) {
  res.send(`
    <form method="post" action="/login">
      <div>
        <label for="username">Username:</label>
        <input type="text" name="username" id="username">
      </div>
      <div>
        <label for="password">Password:</label>
        <input type="password" name="password" id="password">
      </div>
      <div>
        <button>Log in</button>
      </div>
    </form>
  `);
});

在上述代码中,我们创建了一个用于登录验证的路由(/login),当表单数据提交到该路由时,会将用户名和密码进行验证,如果验证通过,则将用户信息存储到 Session 中,然后重定向到首页(/);如果验证不通过,则返回登录页。

在首页的路由(/)中,我们首先判断用户是否已经登录,如果已经登录,则显示欢迎信息;如果没有登录,则重定向到登录页。登录页的路由(/login)中,我们设置了一个表单,用于提交用户名和密码。

另外,为了验证 Session 是否成功存储了用户信息,我们还可以增加一个注销的路由:

app.get('/logout', function(req, res) {
  delete req.session.user;
  res.redirect('/login');
});

当用户访问 /logout 路由时,会清除 Session 中的用户信息,并重定向到登录页。

到此,我们就成功地使用 Session 实现了登录验证功能。如果需要将用户信息存储到数据库中,可以使用 connect-mongoconnect-redis 等模块,进行 Session 存储的扩展。

示例说明

示例一

下面,我们以一个简单的示例来详细说明如何使用 Session 实现登录验证功能。在该示例中,我们创建了一个简单的 Web 程序,包含了登录、注销和欢迎页面:

var express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session');

var app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
  secret: 'secret key',
  resave: false,
  saveUninitialized: true
}));

app.post('/login', function(req, res) {
  var username = req.body.username;
  var password = req.body.password;

  // 省略用户名密码的验证过程

  req.session.user = {
    username: username
  };

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

app.get('/', function(req, res) {
  if (req.session.user) {
    res.send('Hello, ' + req.session.user.username + '<br><a href="/logout">Logout</a>');
  } else {
    res.redirect('/login');
  }
});

app.get('/login', function(req, res) {
  res.send(`
    <form method="post" action="/login">
      <div>
        <label for="username">Username:</label>
        <input type="text" name="username" id="username">
      </div>
      <div>
        <label for="password">Password:</label>
        <input type="password" name="password" id="password">
      </div>
      <div>
        <button>Log in</button>
      </div>
    </form>
  `);
});

app.get('/logout', function(req, res) {
  delete req.session.user;
  res.redirect('/login');
});

app.listen(3000, function() {
  console.log('Server is running at http://localhost:3000');
});

在创建了 app 应用程序之后,我们使用了 bodyParser 中间件、Session 中间件和路由定义。在登录路由(/login)中,我们先获取表单中的用户名和密码,然后省略了用户名密码的验证过程,将用户信息存储到 Session 中,并重定向到首页(/)。在首页路由中,我们先判断用户是否已经登录,如果已经登录,则显示欢迎信息和注销链接;否则,重定向到登录页。在登录页路由中,我们设置了一个用于提交用户名和密码的表单。在注销路由(/logout)中,我们清除了 Session 中的用户信息,并重定向到登录页。

如果我们启动该 Web 应用程序,然后在浏览器中访问 http://localhost:3000 ,会跳转到登录页。在登录页中,输入任意用户名和密码,然后点击登录按钮,会跳转到首页,并显示欢迎信息和注销链接。如果点击注销链接,则会重定向到登录页,且无法再通过 http://localhost:3000 直接访问到首页。

示例二

下面,我们使用 connect-mongo 模块来扩展 Session 的存储,用于在 MongoDB 中存储用户的 Session 数据。首先,需要使用 npm install connect-mongo 命令来安装 connect-mongo 模块。

在安装完成之后,我们可以通过下面的代码来连接 MongoDB 数据库,并使用 connect-mongo 模块来实现 Session 的存储:

var express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session); // 引入 connect-mongo 模块

var app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
  secret: 'secret key',
  resave: false,
  saveUninitialized: true,
  store: new MongoStore({
    url: 'mongodb://localhost/session',
    ttl: 14 * 24 * 60 * 60 // 14 天后自动清除 Session 数据
  })
}));

app.post('/login', function(req, res) {
  var username = req.body.username;
  var password = req.body.password;

  // 省略用户名密码的验证过程

  req.session.user = {
    username: username
  };

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

app.get('/', function(req, res) {
  if (req.session.user) {
    res.send('Hello, ' + req.session.user.username + '<br><a href="/logout">Logout</a>');
  } else {
    res.redirect('/login');
  }
});

app.get('/login', function(req, res) {
  res.send(`
    <form method="post" action="/login">
      <div>
        <label for="username">Username:</label>
        <input type="text" name="username" id="username">
      </div>
      <div>
        <label for="password">Password:</label>
        <input type="password" name="password" id="password">
      </div>
      <div>
        <button>Log in</button>
      </div>
    </form>
  `);
});

app.get('/logout', function(req, res) {
  delete req.session.user;
  res.redirect('/login');
});

app.listen(3000, function() {
  console.log('Server is running at http://localhost:3000');
});

上述代码中,我们添加了一个 store 选项,用于设置 Session 数据的存储策略。在 store 中,我们使用了 connect-mongo 模块来连接 MongoDB 数据库,当用户进行登录验证时,会将用户信息存储到 MongoDB 中,并生成一个对应的 Session ID,在后续访问中根据 Session ID 来识别用户的身份信息。在 store 中,我们还设置了一个 ttl 参数(time to live),表示 Session 数据的过期时间,如果用户超过该时间没有访问该站点,则 Session 数据会被自动清除。

到此,我们就成功地使用 connect-mongo 模块来扩展了 Session 的存储,使得用户的 Session 数据可以存储到 MongoDB 中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Express + Session 实现登录验证功能 - Python技术站

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

相关文章

  • 如何通过node.js来写接口详解

    下面我来为你详细讲解“如何通过node.js来写接口详解”的完整攻略。 如何通过Node.js来写接口详解 1. 什么是接口 接口(API)是指不同软件系统或不同组件之间的通信协议。在开发Web应用时,我们需要通过API来获取数据和与远程服务器进行交互。因此,学会如何编写接口是非常重要的。 2. Node.js介绍 Node.js是一个基于Chrome V8…

    node js 2023年6月8日
    00
  • node.js中的console.trace方法使用说明

    Node.js中的console.trace方法使用说明 console.trace()是Node.js中提供的一个用于跟踪代码调用过程的方法。在开发过程中,当我们需要了解代码执行的过程中调用了哪些函数以及函数调用的顺序时,console.trace()方法是一个非常有用的工具。 使用方法 使用console.trace()方法只需要在代码中调用该方法即可。…

    node js 2023年6月8日
    00
  • M2实现Nodejs项目自动部署的方法步骤

    下面我将为您详细讲解使用M2实现Nodejs项目自动部署的方法步骤。 一、M2概述 M2是一款可以快速部署Node.js项目的工具。它可以非常方便地实现自动化部署,自动化测试,日志分析等功能,将项目部署过程变得更加简单和高效。 二、安装M2 M2可以在Windows,Linux以及MacOS操作系统中运行,您可以从官方网站https://m2.codecas…

    node js 2023年6月8日
    00
  • Node.js获取本机Mac地址的两种方案

    首先我们来讲解一下如何获取本机Mac地址的两种方案。 方案一:使用Node.js内置的OS模块 Node.js内置的OS模块提供了获取本机Mac地址的方法,具体实现如下: const os = require(‘os’); const macAddress = () => { const networkInterfaces = os.networkIn…

    node js 2023年6月8日
    00
  • Node.js Streams文件读写操作详解

    Node.js Streams文件读写操作详解 简介 Streams是Node.js中非常强大的特性之一,它可以让你有效地处理数据流。它可以帮你增强你的Node.js应用的性能,减少内存消耗。在Node.js模块库中,有很多内置的Streams模块,比如http, fs和zlib等。 在本篇文档中,我们将会学习如何在Node.js中使用Streams来进行文…

    node js 2023年6月8日
    00
  • nodejs报digital envelope routines::unsupported错误的最新解决方法

    当在Node.js中使用TLS(Transport Layer Security)连接时,可能会遇到digital envelope routines::unsupported错误,这个错误通常表示您的证书格式不被TLS支持。以下是最新的解决方法: 1. 查看证书格式 首先需要使用以下命令来查看您的证书格式: openssl x509 -in /path/t…

    node js 2023年6月8日
    00
  • node.js下when.js 的异步编程实践

    Node.js下的异步编程模型是该平台的一大特点,但面对复杂的异步代码实现却造成了非常大的困难。为了解决这个问题,许多异步编程库被开发出来。其中,when.js 是一个高效的 Promise/A+ compliant 的库,允许 Node.js 开发人员用更优雅和精简的代码来解决异步代码的问题。下面,我将分享一份when.js的异步编程实践攻略。 when.…

    node js 2023年6月8日
    00
  • 基于node.js express mvc轻量级框架实践

    基于Node.js和Express实现MVC模式是一种常见的轻量级前端框架。以下是使用Node.js和Express实现MVC模式的完整攻略: 步骤1 – 安装Node.js和Express 在本地安装Node.js和Express,可以使用NPM命令行工具进行安装。 npm install express –save 步骤2 – 创建Express应用程…

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