Express + Session 实现登录验证功能

yizhihongxing

以下是详细的“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日

相关文章

  • JavaScript对象字面量和构造函数原理与用法详解

    JavaScript对象字面量和构造函数原理与用法详解 什么是JavaScript对象 在Javascript中,对象是指一组属性的集合,每个属性都是一个键值对。可以将它们看作是一些具有状态和行为的实体。JavaScript中有两种常见的对象创建方法:对象字面量和构造函数。在研究这两种方法之前,先来看看一般的对象创建方式: var person = {}; …

    node js 2023年6月8日
    00
  • JS实现添加,替换,删除节点元素的方法

    要实现JS对节点元素的添加、替换、删除,可以使用DOM操作相关API。 添加节点元素 可以使用createElement()方法创建新的节点元素,并使用appendChild()方法将其添加到指定的父元素下。 // 创建新的节点元素 var newElement = document.createElement(‘p’); // 设置节点文本 newElem…

    node js 2023年6月8日
    00
  • Express框架详解app函数使用实例

    Express框架详解app函数使用实例 什么是Express框架 Express是Node.js的一种轻量级Web开发框架。采用MVC框架模式,通过封装Node.js自有的Http模块,提供了一组简洁明了的API,可用于快速编写Web应用程序。Express框架还支持一个插件化的模式,可自由扩展各种组件,能够满足各种Web开发需求。 app函数使用实例 a…

    node js 2023年6月8日
    00
  • Vue+Node实现的商城用户管理功能示例

    为了讲解“Vue+Node实现的商城用户管理功能示例”的完整攻略,我们需要介绍如下内容: 基本介绍 本示例将通过Vue和Node配合完成一个基于网络的商城用户管理功能,其中前端部分我们使用Vue作为框架,本地服务器采用npm环境,后端服务器采用Node.js完成。 为了使示例更加方便理解,我们将仅实现商城用户管理功能,相关的代码将展示如何实现用户注册、登录、…

    node js 2023年6月8日
    00
  • node.js快速部署vue代码详细步骤

    下面是“node.js快速部署vue代码详细步骤”的完整攻略: 前置条件 在进行本攻略之前必须确保你已经满足以下条件: 已经安装了Node.js。 已经安装了Vue CLI(可通过运行npm install -g @vue/cli安装)。 对于第二个示例,必须拥有一台可以访问公网的服务器。 步骤 第一步:创建Vue项目 在命令行中运行以下命令: vue cr…

    node js 2023年6月8日
    00
  • Windows下nodejs安装及环境配置的实战步骤

    下面是详细的“Windows下nodejs安装及环境配置的实战步骤”攻略: 一. 下载Node.js 首先,我们需要下载Node.js的安装文件。请访问Node.js的官方网站(https://nodejs.org/),然后下载适合您计算机的版本,选择LTS版本即可。推荐使用Windows Installer (.msi)版本,下载完成后,双击打开,开始安装…

    node js 2023年6月8日
    00
  • 解决vue cli4升级sass-loader(v8)后报错问题

    针对“解决vue cli4升级sass-loader(v8)后报错问题”,我会提供以下完整攻略: 问题背景 在升级 sass-loader 到 v8 版本之后,如果项目依赖了 node-sass,就会在启动 npm run serve 命令时遇到下面的错误: Module build failed (from ./node_modules/sass-load…

    node js 2023年6月8日
    00
  • 如何使用puppet替换文件中的string

    使用puppet替换文件中的string,可以通过file_line和replace两个puppet的资源来实现。 file_line资源替换指定行的内容 file_line可以用来替换指定文件中的一行内容。具体的使用方式为: file_line { ‘description’: path => ‘/path/to/file’, line => …

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