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 API详解之 querystring用法实例分析

    Node.js API详解之 querystring用法实例分析 什么是querystring querystring 模块是一个 Node.js 内置模块,主要用于解析和序列化 URL 查询字符串。它提供了一些方法,可以帮助开发者解析和序列化来自http请求、http响应以及url对象的查询字符串数据。这个模块能在两种操作之间进行转换。 querystri…

    node js 2023年6月8日
    00
  • 简单模拟node.js中require的加载机制

    在Node.js中,常用的模块系统是CommonJS规范,其中require函数是加载模块的入口。这里简要介绍一下Node.js中require的加载机制。 加载机制 Node.js中require函数的加载机制基于以下两个原则:1. 模块只会被加载一次,重复的调用require只会返回内存缓存中已有的模块。2. 模块的加载顺序是深度优先,同级模块会被加载一…

    node js 2023年6月8日
    00
  • NODE.JS加密模块CRYPTO常用方法介绍

    下面是针对”NODE.JS加密模块CRYPTO常用方法介绍”的完整攻略。 什么是加密模块CRYPTO 在Node.js中,Crypto是一个内置的加密模块,可以提供包括加密、解密、签名、验证签名等功能。 常用方法 1. createHash createHash方法可以通过传入不同的hash算法名,产生不同的hash值,该方法通常用于密码加密。 示例: co…

    node js 2023年6月8日
    00
  • Node.js HTTP服务器中的文件、图片上传的方法

    Node.js提供了http模块作为内置的HTTP服务器,在其中可以实现文件上传和图片上传的功能。以下是完整攻略: 文件上传 前置条件 在实现文件上传之前,需要安装formidable模块。可以通过运行以下命令安装: npm install formidable 代码示例 const http = require(‘http’); const fs = re…

    node js 2023年6月8日
    00
  • 浅析Nodejs npm常用命令

    我将为您详细讲解“浅析Nodejs npm常用命令”的完整攻略。 一、 什么是npm? npm是Node.js的包管理工具,它能够帮助我们安装、管理依赖,以及发布我们自己的包。 二、npm常用命令 1. npm init npm init命令可以让我们创建一个新的package.json文件,这个文件是用来描述我们的项目的,可以在这个文件中设置项目的基本信息…

    node js 2023年6月8日
    00
  • node全局变量__dirname与__filename的区别

    node全局变量__dirname与__filename的区别 简介 在Node.js中,__dirname 和 __filename 都是全局变量。它们可以在任何地方直接访问,不需要引入其他模块。它们可以用于获取当前模块文件的完整路径和文件名。 __dirname __dirname 代表当前模块文件所在的目录的完整路径,而不包括模块文件本身的名称。 co…

    node js 2023年6月8日
    00
  • Nodejs多站点切换Htpps协议详解及简单实例

    关于”Nodejs多站点切换Htpps协议详解及简单实例” 的攻略,我将按照以下内容来进行讲解: 什么是HTTP和HTTPS协议 Nodejs多站点切换HTTPS协议的实现方法 示例说明 1. 什么是HTTP和HTTPS协议 HTTP(HyperText Transfer Protocol,超文本传输协议) 和 HTTPS (HTTP Secure)协议是在…

    node js 2023年6月8日
    00
  • 使用node.js 获取客户端信息代码分享

    下面是使用node.js获取客户端信息的攻略。 获取客户端信息 什么是客户端信息? 在网络通信中,客户端是指使用网络服务的用户终端(如电脑、手机、平板等),客户端信息是指提供如客户端类型、操作系统、浏览器等与客户端相关的信息。 如何获取客户端信息? 在Node.js中,可以通过request对象来获取HTTP请求的相关信息,其中包括客户端信息。request…

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