当前位置: 首页 > 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…...

STM32驱动WS2812的另一种思路:SPI模拟时序对比PWM方案,哪个更适合你的项目?

STM32驱动WS2812的深度方案对比&#xff1a;SPI模拟与PWM实现的技术解析与选型指南 在嵌入式LED控制领域&#xff0c;WS2812系列智能灯珠因其集成驱动电路和单线通信特性&#xff0c;已成为项目开发中的热门选择。面对不同应用场景对刷新率、稳定性和资源占用的差异化需求&…...

Java 求职者面试:音视频场景与 Spring Boot 应用

面试官提问&#xff1a;如何用 Java 实现音视频场景的后台服务&#xff1f; 场景设定&#xff1a;某互联网大厂正在面试一名 Java 求职者&#xff0c;面试官和候选人燕双非之间的对话如下&#xff1a;第一轮提问 面试官&#xff1a;燕先生&#xff0c;您能否简要说明一下 Java …...

SR-MPLS TE隧道配置实战:基于ENSP的流量工程实验指南

1. SR-MPLS TE技术入门&#xff1a;从理论到实验环境搭建 第一次接触SR-MPLS TE时&#xff0c;我被它"无状态隧道"的特性惊艳到了。传统MPLS TE需要每台设备维护RSVP信令状态&#xff0c;而SR-MPLS TE只需要在头节点计算路径就能实现流量工程&#xff0c;这就像自驾…...

【仅限本次会议披露】SITS2026 AGI原型系统失败案例复盘(12次目标坍缩事件),暴露通用智能最脆弱环节

第一章&#xff1a;SITS2026 AGI原型系统失败案例复盘总述 2026奇点智能技术大会(https://ml-summit.org) SITS2026 AGI原型系统是面向通用认知架构设计的端到端自主推理平台&#xff0c;于2025年11月在ML-Summit沙盒环境中完成最终集成测试。尽管其理论架构覆盖多模态感知、因…...

终极指南:如何参与End-To-End开源加密项目开发

终极指南&#xff1a;如何参与End-To-End开源加密项目开发 【免费下载链接】end-to-end End-To-End is a crypto library to encrypt, decrypt, digital sign, and verify signed messages (implementing OpenPGP) 项目地址: https://gitcode.com/gh_mirrors/en/end-to-end …...

AssetRipper终极指南:如何轻松提取Unity游戏资源的完整教程

AssetRipper终极指南&#xff1a;如何轻松提取Unity游戏资源的完整教程 【免费下载链接】AssetRipper GUI Application to work with engine assets, asset bundles, and serialized files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper 还在为无法获取…...

如何用G-Helper提升华硕笔记本使用体验:从入门到精通

如何用G-Helper提升华硕笔记本使用体验&#xff1a;从入门到精通 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sca…...

从2804云台电机到桌面机械臂:一个STM32/GD32玩家的FOC驱动踩坑全记录

从2804云台电机到桌面机械臂&#xff1a;一个STM32/GD32玩家的FOC驱动踩坑全记录 去年夏天&#xff0c;当我第一次把那个价值不到10元的2804云台电机接上自制的FOC驱动板时&#xff0c;电机发出的刺耳啸叫声让我意识到——真正的挑战才刚刚开始。这不是教科书里标准的电机控制实…...

突破性开源机器人框架:3大创新模块重构智能机械臂开发体验

突破性开源机器人框架&#xff1a;3大创新模块重构智能机械臂开发体验 【免费下载链接】lerobot &#x1f917; LeRobot: Making AI for Robotics more accessible with end-to-end learning 项目地址: https://gitcode.com/GitHub_Trending/le/lerobot 在机器人技术快速…...

智能代码生成异味检测落地手册(2024企业级检测清单V3.2)

第一章&#xff1a;智能代码生成代码异味检测 2026奇点智能技术大会(https://ml-summit.org) 现代大语言模型驱动的代码生成工具&#xff08;如GitHub Copilot、CodeWhisperer&#xff09;在提升开发效率的同时&#xff0c;也悄然引入了新型代码异味——即语义正确但设计脆弱…...