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

网站常用功能模块-鉴权

一:JWT是什么?

常用鉴权方式有很多种,今天主要介绍基于token的鉴权方式JWT(Json JSON Web Token)。因为这种方式实现起来方便快捷。整体实现逻辑如下

第一次登陆时,前端携带账号和密码请求登录接口。服务端在验证登录通过后,将用户信息加密为一个token字符串返给前端。前端将token存在localstorage中。

在一般的业务请求中,前端从localstorage中取出并携带token。服务端接收到token后解密验证其时效性及合法性,如果token通过则正常返回数据,不通过则返回异常。

二:前端注意点

按照惯例前端请求接口时,携带token发送。token建议放在header中,命名为Authorization。尽量避免将token与一般入参一块放在body中,这样更加规范。

var config = {headers: {'Authorization': Token // 将 Token 放入 Authorization Header 中}};var PostData = Object.assign({}, Para['RequestData']);axios.post(Para['Url'], PostData,config).then(function (response) {})

然后在封装的异步请求方法中,直接携带token。即可完成集中处理,一劳永逸

Vue.prototype.SQAjax = function (Para) {var that = this;let AjaxLoading = Loading.service({ background: 'rgba(0,0,0,0.5)',lock: true,text: '加载中',spinner: 'el-icon-loading',fullscreen: true});var Token = localStorage.getItem('sqBlogToken') ? localStorage.getItem('sqBlogToken') : '';if (!Token) {AjaxLoading.close(); // 中断代码前,注意关闭loadingthis.$router.push({ name: 'LoginPage' });return false;}// 设置请求头var config = {headers: {'Authorization': Token // 将 Token 放入 Authorization Header 中}};var PostData = Object.assign({}, Para['RequestData']);axios.post(Para['Url'], PostData,config).then(function (response) {AjaxLoading.close();if (response.data.statusCode == 200) {Para['Success'](response.data.data);} else if (response.data.status == '1') { that.$message({message: response.data.data.message,type: 'success'});that.$router.push({name: 'LoginPage',});} else { // 返参异常的场景处理that.$message({message: response.data.data.message,type: 'error',duration: 900});}}).catch(function (error) { // 接口不通的场景处理AjaxLoading.close();that.$message({message: "接口不通",type: 'error',duration: 900});});}

三:服务端工作 

1、处理token的公共类

Java中使用jjwt的原生方法,即可以轻松搞定加密解密。先注入依赖,然后创建一个JwtUtil.java,当作公共文件备用。

其中需要注意密钥的保存,如果代码开源可将密钥放在配置文件中,且保障该配置文件不开源。

// pom依赖注入
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
public class JwtUtil {private static final String SECRET_KEY = "your_secret_key";// 生成 Tokenpublic static String generateToken(User user) {return Jwts.builder().setSubject(user.getName()).claim("id", user.getId()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1 hour expiration.signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}// 验证 Tokenpublic static Claims validateToken(String token) throws Exception {try {return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();} catch (ExpiredJwtException e) {throw new Exception("Token 已过期", e);} catch (UnsupportedJwtException e) {throw new Exception("Token 格式不支持", e);} catch (MalformedJwtException e) {throw new Exception("Token 无效", e);} catch (SignatureException e) {throw new Exception("Token 签名无效", e);} catch (IllegalArgumentException e) {throw new Exception("Token 参数无效", e);}}
}

2、验证token

如果开发管理后台,除了登录/注册操作,其他接口基本都需要鉴权。此种场景每个controller都鉴权一次过于繁琐。可使用拦截器,做到统一处理。

如下为配置拦截器,可将登录注册等不需要token验证的接口加入白名单。

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate JwtInterceptor jwtInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor).addPathPatterns("/**")  // 拦截所有请求.excludePathPatterns("/login", "/register");  // 排除登录和注册接口}
}

如下为拦截器具体代码

@Component
public class JwtInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("Authorization");if (token == null || token.isEmpty()) {response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.getWriter().write("Token is missing");return false;}try {JwtUtil.validateToken(token);} catch (Exception e) {response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.getWriter().write("Invalid token: " + e.getMessage());return false;}return true;}
}

3、生成token

关于需要生成token的接口,其实只有登录接口一个地方。其余接口都是验证token

可在校验登录成功后,将用户信息及token一并返回前端。

String token = jwtUtil.generateToken(userInfo);
UserAuthResponse userAuthResponse = new UserAuthResponse(token, userInfo);
return ApiResponse.success(userAuthResponse);

相关文章:

网站常用功能模块-鉴权

一&#xff1a;JWT是什么&#xff1f; 常用鉴权方式有很多种&#xff0c;今天主要介绍基于token的鉴权方式JWT&#xff08;Json JSON Web Token&#xff09;。因为这种方式实现起来方便快捷。整体实现逻辑如下 第一次登陆时&#xff0c;前端携带账号和密码请求登录接口。服务…...

直接插入排序、折半插入排序、2路插入排序、希尔排序

本篇是排序专栏博客的第一篇&#xff0c;主要探讨以 “插入” 为核心思想的排序算法该如何实现 文章目录 一、前言二、直接插入排序1. 算法思想与操作分析2. 代码实现version 1version 2 3. 复杂度分析 三、折半插入排序1. 算法思想与操作分析2. 代码实现3. 复杂度分析 四、2路…...

FQ-GAN代码解析

主要看 model 、loss 和 data 部分如何实现和处理的。 model—VQ_modelsVQModelEncoderVectorQuantizerDecoder loss—VQLoss_triple_codebook model—VQ_models 创建vq_model直接根据传入的模型压缩倍率8/16初始化对应的VQ_8/VQ_16&#xff0c;两者都是初始化一个VQModel的类…...

如何恢复已删除的 Telegram 消息 [iOSamp;Android]

Telegram 是一款功能强大的消息应用程序&#xff0c;因其易用性、隐私保护和众多炫酷功能而深受用户喜爱。然而&#xff0c;有时我们会不小心删除重要的消息。在这种情况下你应该做什么&#xff1f; 本文将为您提供简单有效的解决方案来恢复 Telegram 上已删除的消息&#xff…...

asp.net core中的 Cookie 和 Session

在 Web 开发中&#xff0c;用户会话管理是非常重要的&#xff0c;尤其是在需要保持用户状态和身份验证的应用中。ASP.NET Core 提供了多种状态管理技术&#xff0c;如 Cookie 和 Session&#xff0c;它们可以帮助你管理用户会话、存储数据并实现用户身份验证等功能。下面将详细…...

Python实现一个简单的 HTTP echo 服务器

一个用来做测试的简单的 HTTP echo 服务器。 from http.server import HTTPServer, BaseHTTPRequestHandler import jsonclass EchoHandler(BaseHTTPRequestHandler):def do_GET(self):# 构造响应数据response_data {path: self.path,method: GET,headers: dict(self.headers…...

Ruby 中文编码

Ruby 中文编码 在 Ruby 编程语言中处理中文编码是一个常见的需求&#xff0c;尤其是在中国和其他使用中文的地区。Ruby 是一种动态、开放源代码的编程语言&#xff0c;它支持多种字符编码&#xff0c;包括中文编码。本文将探讨在 Ruby 中处理中文编码的几种方法&#xff0c;以…...

淘金优化算法的信息共享与更新机制改进

淘金优化算法作为一种模拟自然界淘金过程的启发式搜索算法,在解决复杂优化问题时展现出独特优势。然而,其性能在很大程度上依赖于信息共享与更新机制的有效性。传统机制在面对高维、多模态等复杂问题时,往往存在信息交流不畅、更新滞后等问题,导致算法陷入局部最优或收敛速…...

Python中的ast.literal_eval:安全地解析字符串为Python对象

Python中的ast.literal_eval&#xff1a;安全地解析字符串为Python对象 什么是ast.literal_eval&#xff1f;为什么说它是“安全”的&#xff1f; 如何使用ast.literal_eval&#xff1f;示例1&#xff1a;将字符串转换为列表示例2&#xff1a;将字符串转换为字典示例3&#xff…...

【AI数学基础】线性代数:内积和范数

&#xff08;观前提醒&#xff0c;这是工科AI相关的数学基础的学习笔记&#xff0c;不是数学专业的文章&#xff0c;所以没有严谨的证明和定义&#xff0c;数院大神请勿批评&#xff09; 2. 内积和范数 2.1 内积的定义 从代数的角度来说&#xff0c;内积是两个向量之间的一种…...

Go语言的 的泛型(Generics)核心知识

Go语言的泛型&#xff08;Generics&#xff09;核心知识 引言 在编程语言的发展历程中&#xff0c;泛型是一项重要的特性。它使得程序员能够编写更加灵活和可重用的代码&#xff0c;减少了代码重复&#xff0c;提高了类型安全性和性能。从最初的C和Java&#xff0c;到现代的R…...

C++vector

1. vector 的介绍及使用 1.1vector的介绍 vector的文档介绍 1.vector是表示可变大小数组的序列容器 2.就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素&#xff0c;也就是意味着可以采用下标对vector 的元素进行访问&#xff0c;和数组一样高效但是又不像数组…...

如何配置【Docker镜像】加速器+【Docker镜像】的使用

一、配置Docker镜像加速器 1. 安装/升级容器引擎客户端​ 推荐安装1.11.2以上版本的容器引擎客户端 2. 配置镜像加速器​ 针对容器引擎客户端版本大于1.11.2的用户 以root用户登录容器引擎所在的虚拟机 修改 "/etc/docker/daemon.json" 文件&#xff08;如果没有…...

Docker--Docker Network(网络)

Docker Network&#xff08;网络&#xff09;是Docker容器之间和容器与外部网络之间的通信和连接的一种机制。以下是对Docker Network的详细解释&#xff1a; 一、Docker网络的重要性 Docker容器网络是为应用程序所创造的虚拟环境的一部分&#xff0c;它能让应用从宿主机操作…...

Vue项目中生成node_modules文件夹的两种常用方法及npm优势

在Vue项目中生成node_modules文件夹的过程非常简单,主要步骤如下: 1、使用 npm 安装依赖包; 2、使用 yarn 安装依赖包。其中,推荐使用npm安装依赖包,原因如下: 兼容性更广:npm是Node.js的默认包管理工具,具有更高的兼容性。社区支持:npm拥有更大的用户基础和社区支持,…...

如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库教程

简介 本教程将向你介绍如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库。 Apache Cassandra 是一个分布式的 NoSQL 数据库&#xff0c;旨在处理跨多个普通服务器的大量数据&#xff0c;并提供高可用性&#xff0c;没有单点故障。Apache Cassandra 是一个高度可扩展的分布…...

leetcode 面试经典 150 题:轮转数组

链接轮转数组题序号189题型数组解法1. 额外数组法&#xff0c;2. 原数组翻转法&#xff08;三次翻转法&#xff09;难度中等熟练度✅✅✅✅ 题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,…...

如何在 Mac 上轻松恢复语音备忘录

在 Mac 上丢失重要的语音备忘录可能会令人沮丧&#xff0c;但好消息是有多种方法可以恢复它们。无论您是意外删除它们还是由于系统故障而丢失&#xff0c;您都可以轻松地在 Mac 上恢复语音备忘录。 在本指南中&#xff0c;我们将探讨两种方法&#xff1a;在没有备份的情况下恢…...

C++ 基础概念: 未定义行为(Undefined Behavior)

文章目录 Intro如何正确认识 UB有多少未定义行为?对 UB 的误解 C 标准定义的几种行为1. 定义的行为 (defined behavior)2. 实现定义的行为 (implementation defined behavior)3. 未指定的行为 (unspecified behavior)4. 未定义行为 (undefined behavior)揭晓答案 C 中如何定义…...

Rad Studio 11.3 Alexandria 3236a(DELPHI 11.3)官方ISO/百度云盘 下载地址

Embarcadero很高兴地宣布RAD Studio 11 Alexandria Release 3的发布&#xff0c;也被称为RAD Studio 11.3&#xff0c;同时发布的还有Delphi 11.3和CBuilder 11.3。这个版本专注于质量和改进&#xff0c;建立在RAD Studio 11 Alexandria三个前版本的伟大的新功能上。 RAD Studi…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...