在next.js的13.2.1版本中使用中间件,实现禁止特定ip访问网址所有页面

本文主要是介绍在next.js的13.2.1版本中使用中间件,实现禁止特定ip访问网址所有页面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在实现实现禁止特定ip访问网址所有页面时,有两种方式,一种是针对单个页面,另一种是针对整个网站

在pages/api中创建文件使用,针对单个页面

之前是在pages/api下创建的中间件去实现的,但是使用pages/api中的中间件需要手动调用,也就是说如果全部页面都需要使用的话,那么就要在所有页面中去调用,页面刷新会重新加载getIp文件,也就是说会重置cachedData、cacheTime这些变量,不刷新的话就不会每次只会执行handler函数内部的代码,所以可以使用缓存,每次刷新后,就会重新请求一次,不刷新且满足条件的,就会使用缓存。
pages/api/getIp.js

// ipBlockMiddleware.js// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import axios from 'axios'
let cachedData = null;
let cacheTime = null;
/**
* 获取地区信息
* @param {*} req
* @param {*} res
*/
export default async function handler(req, res, next) {const blockedIPs = ['82.116.192.22']; // 被禁止的IP列表:塞浦路斯// 设置缓存有效期为10分钟const TEN_MINUTES = 10 * 60 * 1000;try {// 检查缓存是否有效if (cachedData && cacheTime && Date.now() - cacheTime < TEN_MINUTES) {} else {// 获取ip信息const response = await axios.get('https://api.ipdatacloud.com/v2/query?key=xxx',{ timeout: 5000 })// 更新缓存cachedData = response.data.data.locationcacheTime = Date.now();}if (blockedIPs.includes(cachedData?.ip)) {res.statusCode = 403res.end('Forbidden');} else {next && next();}} catch (error) {console.log(error);}
}

如果要在首页中使用getIp,就需要在index.js页面中的getServerSideProps使用,如果对网站所有页面都需要使用的话,那工程就有点大。所有这种方法只适用于单个页面的时候。
注意:** getServerSideProps 只能在组件中使用,像_app.js是不能使用的**


import getIp from './api/getIp'
export async function getServerSideProps({ req, res, locale }) {await getIp(req, res, () => {console.log(1111111);}); // 使用中间件return {props: {},};
}

在src目录下创建一个middleware.js文件实现全局使用中间件

首先要在src目录下创建一个middleware.js文件,在这个文件创建的,不需要手动调用,直接作用于全局。
注意:

  1. 这里不能使用axios发起请求,所以使用fetch
  2. middleware需要导出
import { NextResponse, NextRequest } from 'next/server'
// import axios from 'axios'
export const middleware = async (request, response) => {const blockedIPs = ['82.116.192.22']; // 被禁止的IP列表:塞浦路斯try {// 这里不能使用axios发起请求,所以使用fetchconst p = await fetch('https://api.ipdatacloud.com/v2/query?key=xxxxx')const d = await p.json()const ip = d.data?.location?.ipif (blockedIPs.includes(ip)) {// 符合条件则禁止页面访问,通过NextResponse.json在页面显示Forbidden字样return NextResponse.json('Forbidden', {status: 403})} else {// 正常就不做处理,直接下一步return NextResponse.next()}} catch (error) {console.log(error);}
};

这篇关于在next.js的13.2.1版本中使用中间件,实现禁止特定ip访问网址所有页面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/663755

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

ONLYOFFICE 8.1 版本桌面编辑器测评

在现代办公环境中,办公软件的重要性不言而喻。从文档处理到电子表格分析,再到演示文稿制作,强大且高效的办公软件工具能够极大提升工作效率。ONLYOFFICE 作为一个功能全面且开源的办公软件套件,一直以来都受到广大用户的关注与喜爱。而其最新发布的 ONLYOFFICE 8.1 版本桌面编辑器,更是带来了诸多改进和新特性。本文将详细评测 ONLYOFFICE 8.1 版本桌面编辑器,探讨其在功能、用户

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动