当前位置: 首页 > news >正文

基于typescript+express实现一个简单的接口权限验证

 package.json

"scripts": {"start": "nodemon src/main.ts","start:a": "nodemon src/a.ts","build": "tsc","build:dev": "tsc src/main.ts"},

express服务器文件

import * as express from 'express';
import  { Request, Response, NextFunction }  from 'express'
import *  as jwt from 'jsonwebtoken';const app = express();
const secretKey = 'sean';app.use(express.static("static"))interface AuthenticatedRequest extends Request {user?: any;
}
// 登录接口
app.post('/login', (req: AuthenticatedRequest , res: Response) => {// 假设登录验证成功,生成Tokenconst token = jwt.sign({ username: 'admin' }, secretKey, { expiresIn: '1h' });res.json({ token });
});// 验证Token的中间件
const authenticateToken = (req: AuthenticatedRequest , res: Response, next: NextFunction) => {const authHeader = req.headers['authorization'];console.log("authHeader:",authHeader)// const token = authHeader && authHeader.split(' ')[1];const token = authHeader;console.log("token:",token)if (token == null) {return res.sendStatus(401);}jwt.verify(token, secretKey, (err: any, user: any) => {if (err) {console.log("verify-err",err)return res.sendStatus(403);}req.user = user;next();});
};// 需要验证Token的接口
app.get('/protected', authenticateToken, (req: AuthenticatedRequest, res: Response) => {console.log("req",req)res.json({ message: 'Protected route', user: req.user });
});app.get('/list', authenticateToken, (req: AuthenticatedRequest, res: Response) => {console.log("req",req)res.json({ data: [] });
});
app.get("/static",(req,res)=>{res.sendFile("index.html",{root:"./"})
})
// 启动服务器
app.listen(4000, () => {console.log('Server is running on port 4000');
});

在根目录新建一个index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><form ><div><span>用户名:</span><input id="user" type="text" placeholder="please input username"></div><div><span>密码:</span><input id="password" type="password" placeholder="please input username"></div><div><button id="btn">提交</button></div></form><div ><button id="send">send</button></div><div ><button id="listBtn">获取list</button></div></div>
</body>
</html>
<script>let user=document.getElementById("user")let password=document.getElementById("password")let btn=document.getElementById("btn")let sendBtn=document.getElementById("send")let listBtn=document.getElementById("listBtn")const submit=(e)=>{e.preventDefault()let data={username:user.value,password:password.value}fetch("http://localhost:4000/login",{method:"post",body:JSON.stringify(data)}).then(res=>{res.json().then(res=>{console.log("response",res)let token=res.token;sessionStorage.setItem("authorization",token)})})console.log("data",data)}const request=()=>{fetch("http://localhost:4000/protected",{method:"get",headers:{"authorization":sessionStorage.getItem("authorization")}}).then(res=>{res.json().then(response=>{console.log("pretect--response",response)})})}const requestList=()=>{fetch("http://localhost:4000/list",{method:"get",headers:{"authorization":sessionStorage.getItem("authorization")}}).then(res=>{res.json().then(response=>{console.log("pretect--response",response)})})}btn.addEventListener("click",submit)sendBtn.addEventListener("click",request)listBtn.addEventListener("click",requestList)</script>

相关文章:

基于typescript+express实现一个简单的接口权限验证

package.json "scripts": {"start": "nodemon src/main.ts","start:a": "nodemon src/a.ts","build": "tsc","build:dev": "tsc src/main.ts"}, express服务器文件 import * as…...

yolov7改进优化之蒸馏(二)

续yolov7改进优化之蒸馏&#xff08;一&#xff09;-CSDN博客 上一篇已经基本写出来yolov7/v5蒸馏的整个过程&#xff0c;不过要真的训起来我们还需要进行一些修改。 Model修改 蒸馏需要对teacher和student网络的特征层进行loss计算&#xff0c;因此我们forward时要能够返回需…...

生产与作业管理(POM)的历史

1800年&#xff0c;惠特尼&#xff1a;零件标准化、质量管理。 1881年&#xff0c;泰勒&#xff1a;人员选拔、计划和时程安排、动作研究。管理与劳动分开。 - 使雇员与工作相适应。 - 提供适当的训练。 - 提供正确的工作方法和工具。 - 建立适当的激励机制促使工作得以完成。 …...

交换机基础(二)

一、VLAN 基础知识 虚拟局域网 (Virtual Local Area Network,VLAN) 是一种将局域网设 备从逻辑上划分成一个个网段&#xff0c;从而实现虚拟工作组的数据交换技术。 这一技术主要应用于3层交换机和路由器中&#xff0c;但主流应用还是在3层交换机中。 VLAN 是基于物理网络上构建…...

回归预测 | MATLAB实现基于BP-Adaboost的BP神经网络结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于BP-Adaboost的BP神经网络结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于BP-Adaboost的BP神经网络结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BP-Adaboost的BP…...

【蓝桥每日一题]-动态规划 (保姆级教程 篇11)#方格取数2.0 #传纸条

目录 题目&#xff1a;方格取数 思路&#xff1a; 题目&#xff1a;传纸条 思路&#xff1a; 题目&#xff1a;方格取数 &#xff08;跑两次&#xff09; 思路&#xff1a; 如果记录一种方案后再去跑另一个方案&#xff0c;影响因素太多了&#xff0c;所以两个方案要同时开…...

前端TypeScript学习day05-索引签名、映射与类型声明文件

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 索引签名类型 映射类型 索引查询&#xff08;访问&#xff09;类型 基本使用 同时查询多个索引的类型…...

Echarts柱状图数据过多设置滚动条效果

未设置前&#xff1a; 设置后&#xff1a; dataZoom: [ { show: true, height:8, bottom:0, startValue: 0, //起始值 endValue: 5, //结束值 showDetail: fals…...

64 最长公共子序列

最长公共子序列 题解1 DP 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的 最长公共子序列的长度。如果不存在 公共子序列&#xff0c;返回 0 。 一个字符串的子序列是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…...

matlab常用函数

绘图函数 一、plot()&#xff1a;二维图形绘制 1、plot(y)&#xff1a; 对于只含一个输入参数的plot函数&#xff0c;如果输入参数y为向量&#xff0c;则以该参数为纵坐标&#xff0c;横坐标从1开始至与向量的长度相等&#xff1b;如果输入参数y是矩阵时&#xff0c;则按列绘…...

Python配置镜像源

Python3安装pika的准备 Windows下配置镜像源可以按照如下操作。 1.winR执行%APPDATA% %APPDATA%后&#xff0c;创建pip文件夹&#xff0c;并创建pip.ini配置文件 查看此目录下是否有pip目录&#xff0c;如果没有则需要创建&#xff0c;并在pip目录下以文本方式添加pip.ini文件…...

Linux防火墙Centos6的常用命令iptables

文章目录 一、iptables基础知识二、作者玩玩的配置文件三、iptables中常用的参数以及作用-j参数的动作类型 四、安装iptables五、iptables启动命令六、iptables命令结构命令例子默认执行方式执行iptables命令和写入配置文件两种方式的对比 相对常用的命令参考文档 一、iptables…...

python中的贪心算法-求顾客的最小的等待时间

一. 设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti(1<i<n)。如何安排n个顾客的服务次序才能使顾客总的等待时间达到最小? nint(input(请输入顾客的位数: ))times[] for i in range(n):timeint(input(f请输入顾客{i1}的服务时间: ))times.append(time) times.so…...

【JAVA springframework.http】如何发送HTTP请求

Springboot之restTemplate https://blog.csdn.net/weixin_43702146/article/details/116567707 public Result doHandlePostJson(String restUri, String jsonData)throws Exception {Result result null;try {// logger记录log.info("doHandlePostJson request restUr…...

字符串反转(Python)

1. 整体流程 为了实现递归反转n个字符串的功能&#xff0c;我们可以按照以下步骤进行操作&#xff1a; 步骤动作1定义递归函数2判断递归结束条件3处理递归函数的基本情况4调用递归函数&#xff0c;递归处理子问题5返回递归结果 我将详细解释每一步的具体操作&#xff0c;并提…...

驱动开发day4

通过字符设备驱动的分步实现编写LED驱动&#xff0c;另外实现设备文件和驱动的绑定 head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }…...

Flink之Window窗口机制

窗口Window机制 窗口概述窗口的分类是否按键分区按键分区窗口非按键分区 按照驱动类型按具体分配规则滚动窗口Tumbling Windows滑动窗口 Sliding Windows会话窗口 Session Windows全局窗口 Global Windows 时间语义窗口分配器 Window Assigners时间窗口计数窗口例子 窗口函数 W…...

【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )

文章目录 一、继承 组合 模式的类对象 构造函数和析构函数调用规则1、场景说明2、调用规则 二、完整代码示例分析1、代码分析2、代码示例 一、继承 组合 模式的类对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 ,又 在类中 维护了一个 其它类型 的…...

Spark内核调度

目录 一、DAG &#xff08;1&#xff09;概念 &#xff08;2&#xff09;Job和Action关系 &#xff08;3&#xff09;DAG的宽窄依赖关系和阶段划分 二、Spark内存迭代计算 三、spark的并行度 &#xff08;1&#xff09;并行度设置 &#xff08;2&#xff09;集群中如何规划并…...

STM32串口

前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 目前已经学习了GPIO的输入输出&#xff0c;但是没有完整的显示信息&#xff0c;最便宜的显示就是串口。 000 -111 AVR单片机 已经学会过了&#xff0c; 提示&#xff1a;以下是本篇文章正文内容&#x…...

基于File-Based App开发MVP项目咆

Issue 概述 先来看看提交这个 Issue 的作者是为什么想到这个点子的&#xff0c;以及他初步的核心设计概念。?? 本 PR 实现了 Apache Gravitino 与 SeaTunnel 的集成&#xff0c;将其作为非关系型连接器的外部元数据服务。通过 Gravitino 的 REST API 自动获取表结构和元数据&…...

MangaReader插件开发实战:手把手教你编写哔咔漫画插件

MangaReader插件开发实战&#xff1a;手把手教你编写哔咔漫画插件 【免费下载链接】MangaReader 一个漫画 APP&#x1f4f1;&#xff0c;基于 react-native 构建&#xff0c;兼容 Android、Ios 平台 项目地址: https://gitcode.com/gh_mirrors/ma/MangaReader MangaRead…...

i.MX6ULL接OV2640摄像头踩坑记:从硬件改线到内核补丁的完整排错流程

i.MX6ULL接OV2640摄像头踩坑记&#xff1a;从硬件改线到内核补丁的完整排错流程 第一次将OV2640摄像头模块接入i.MX6ULL开发板时&#xff0c;我本以为按照官方文档操作就能轻松搞定。然而现实给了我一记响亮的耳光——从硬件连接、内核驱动到应用层验证&#xff0c;几乎每个环节…...

DAMOYOLO-S跨平台部署演示:从Ubuntu服务器到Windows客户端的全链路

DAMOYOLO-S跨平台部署演示&#xff1a;从Ubuntu服务器到Windows客户端的全链路 最近在做一个项目&#xff0c;需要把目标检测模型部署到不同的设备上&#xff0c;既要跑在云端服务器做批量处理&#xff0c;又要在本地Windows电脑上实时运行。试了好几个模型&#xff0c;要么部…...

ComfyUI工作流分享:一键生成社交媒体配图与头像壁纸

ComfyUI工作流分享&#xff1a;一键生成社交媒体配图与头像壁纸 1. ComfyUI简介与核心优势 ComfyUI是一款基于节点式工作流的AI图像生成工具&#xff0c;它通过可视化连接不同功能模块&#xff0c;让用户可以灵活定制图像生成流程。与传统的WebUI界面相比&#xff0c;ComfyUI…...

记一次Webshell流量分析 | 添柴不加火甭

1. 哑铃图是什么&#xff1f; 哑铃图&#xff08;Dumbbell Plot&#xff09;&#xff0c;有时也称为DNA图或杠铃图&#xff0c;是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中&#xff0c;我们通常使用两条折…...

造相-Z-Image效果展示:4090深度优化,中英文提示词直出惊艳作品

造相-Z-Image效果展示&#xff1a;4090深度优化&#xff0c;中英文提示词直出惊艳作品 你是否好奇&#xff0c;当顶级的RTX 4090显卡遇上专为它深度优化的文生图引擎&#xff0c;会产生怎样令人惊叹的作品&#xff1f;今天&#xff0c;我们不谈复杂的参数&#xff0c;不聊晦涩…...

终极指南:Armeria与Spring Boot无缝整合的企业级应用开发最佳实践

终极指南&#xff1a;Armeria与Spring Boot无缝整合的企业级应用开发最佳实践 【免费下载链接】armeria Your go-to microservice framework for any situation, from the creator of Netty et al. You can build any type of microservice leveraging your favorite technolog…...

掌握PerfView:ETW与EventPipe数据模型的终极指南

掌握PerfView&#xff1a;ETW与EventPipe数据模型的终极指南 【免费下载链接】perfview PerfView is a CPU and memory performance-analysis tool 项目地址: https://gitcode.com/gh_mirrors/pe/perfview PerfView是一款强大的CPU和内存性能分析工具&#xff0c;它能够…...

5分钟搞定明日方舟重复劳动:MAA自动化助手完整攻略

5分钟搞定明日方舟重复劳动&#xff1a;MAA自动化助手完整攻略 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitcod…...