token的创建与解析,并配合拦截器使用
场景:
进行web应用开发时,往往需要对当前用户进行身份判断,此时可以使用token技术
1.导入依赖
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><scope>runtime</scope> </dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><scope>runtime</scope> </dependency>
2.创建JwtUtil类
public class JwtUtil {//设置密码private static SecretKey secretKey = Keys.hmacShaKeyFor("gcKqM5Cgn5eq6OLE6eP61LXfvKkfrSqz".getBytes());//编写Token生成的静态方法,方便调用public static String createToken(Long userId, String username) {String jwt = Jwts.builder()//设置过期时间.setExpiration(new Date(System.currentTimeMillis() + 3600000*24*24))//设置token中所带的信息.setSubject("LOGIN_USER").claim("userId", userId).claim("username", username)//设置密钥,设置加密方式.signWith(secretKey, SignatureAlgorithm.HS256).compact();return jwt;}//编写解析Token的方法public static Claims parseToken(String token) {if (token == null) {throw new LeaseException(ResultCodeEnum.ADMIN_LOGIN_AUTH);}try {JwtParser jwtParser = Jwts.parserBuilder().setSigningKey(secretKey).build();//会返回一个带着信息的claims对象return jwtParser.parseClaimsJws(token).getBody();} catch (ExpiredJwtException e) {throw new LeaseException(ResultCodeEnum.TOKEN_EXPIRED);} catch (JwtException e) {throw new LeaseException(ResultCodeEnum.TOKEN_INVALID);}}public static void main(String[] args) {System.out.println(createToken(8L, "用户-20080"));} }
3.使用自定义拦截器进行Token验证
@Component public class AuthenticationInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//从请求头中获取Token(这里的字段名因人而异)String token = request.getHeader("access-token");Claims claims = JwtUtil.parseToken(token);Long userId = claims.get("userId", Long.class);String username = claims.get("username", String.class);/***此时可以通过获取到的用户信息判断用户信息是否正确,来决定是否放行 ***/return true;}
4.创建配置类进行拦截器装载
@Configuration public class WebMvcConfiguration implements WebMvcConfigurer {//获取之前自定义的过滤器@Resourceprivate AuthenticationInterceptor authenticationInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//装载过滤器registry.addInterceptor(this.authenticationInterceptor)//添加需要拦截的请求路径.addPathPatterns("/app/**")//添加不需要拦截的请求路径.excludePathPatterns("/app/login/**");} }
相关文章:

token的创建与解析,并配合拦截器使用
场景: 进行web应用开发时,往往需要对当前用户进行身份判断,此时可以使用token技术 1.导入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><scope>runtime<…...

Oracle 数据库历史备份数据恢复验证
Oracle ASM 管理的数据库历史备份数据恢复至单实例数据库 简介: 验证 ASM 管理的数据库的历史备份恢复至单实例数据库(主要目的在于验证历史备份是否可用的一次恢复演练) 一、恢复演练系统选择 根据数据库情况选择恢复测试的环境。 此次恢…...

【网络面积篇】TCP断开连接(笔记)
目录 一. 四次挥手 (1)过程描述 (2)为什么是四次挥手? 二、相关问题 1. 第一次挥手丢失了,会发生什么? 2. 第二次挥手丢失了,会发生什么? 补充:close …...

下跌多少才能涨回来?
文章目录 上涨下跌函数关系函数图形数学分析 上涨下跌函数关系 最近炒股很热,对于股票来说,有个很重要的参数涨跌幅,那么下跌多少才能涨回来?这个不需要太深的知识就可以计算出来,下跌和上涨不是等价的,下跌…...

【AAOS】【源码分析】CarSystemUI -- CarSystemBar
CarSystemBar不像Android手机那样固定的顶部“状态栏”和底部“导航栏”,而是将StatusBar和NavigationBar都统称为SystemBar,可以通过如下配置为每侧最多配置一个“系统栏”。 packages/apps/Car/SystemUI/res/values/config.xml<!-- Configure which system bars should …...

[供应链] 邀请招标
1.邀请招标定义 邀请招标(Invitation to Bid by Request) 也称为有限竞争性招标(limited Competitive Bidding)或选择性招标(Selected Bidding) 邀请招标的采购方式下,采购人(如政府机构、企业或其他组织)不是公开发布招标信息,而是根据供应商或承包商…...

VS2017+Qt5.12.9+CMake3.30.2编译VTK 9.2.0
一.准备工作 vs2017,QT,Cmake自行下载准备, VTK下载地址 1.官网下载 2.github下载 二.编译VTK源码 1.个人习惯创建以下目录,一个源码目录,Build为vs解决方案输出目录和编译输出以及中间生成文件目录 2.cmake基础…...

Java线程CPU占用过高如何排查?
使用ps命令查看java进程详细信息: ps aux | grep java使用top命令查看系统进程占用情况 top使用jstack命令导出Java进程的堆栈信息 jstack pid | grep tid -A 10 "java.lang.Thread.State" > gc.log找出占用cpu最高的线程id: top -Hp -d 1 …...

uniapp推送配置流程
Dcloud Dcloud注册账号 个推 了解即可 注册个推账号 ios配置流程 需配置含有推送的描述文件以及p8证书 配置推送证书 ios证书配置报技术错误(参数错误) TeamID-苹果开发者账号唯一的ID 安卓需配置多厂商 小米手机需要配置小米厂商 华为手机则需…...

qt QPicture详解
1、概述 QPicture类是Qt框架中的一个重要图形类,它主要用于记录和回放QPainter的绘图指令。这个类能够跨平台、无分辨率依赖地绘制图形,非常适合用于实现打印预览和图像操作等场景。QPicture可以将绘图操作序列化为一种独立于平台的格式,保存…...

ScheduledFuture Source Code Analysis
ScheduledFuture Overview is a delayed result-bearing action, 可以被cancel.通常是在ScheduledExecutorService里面schedule一个task, 然后ScheduledFuture是其task执行接受后的返回结果。 Code Analysis 继承于两个接口: extends Delayed, Future一些继承ch…...

【CSS】CSS 样式重置 (normalize.css 和 reset.css) 和通用样式配置
一般来说,每一个项目初始化阶段都需要样式重置和样式定制化。样式重置最常用的就是 normalize.css 和 reset.css 这两个文件。 他们的区别: Normalize.css更加注重保留有用的浏览器默认样式,仅修复浏览器之间的不一致性,适用于需…...

自动化机器学习(AutoML)详解
自动化机器学习(AutoML)详解 引言 在数据驱动的时代,将庞大的数据集转化为有价值的洞察和预测模型是众多组织的首要任务。然而,传统的机器学习流程复杂且耗时,包括数据预处理、特征选择、模型选择、调参以及模型评估…...

Linux: network:erspan0
文章目录 问题介绍生成时间:代码Linux引入后面NONE是怎么生成的问题 最近看到一个网卡是erspan0,不知道是做什么用的: # ip -d link show erspan0 7: erspan0@NONE: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 10000...

第11课 计算思维
从二级考试开始,计算思维基本上以编程题的形式考察。为了避免一看就会,一写就废的情况,需要我们加强编程练习,把学到的知识,通过实战练习,变成自己的本领。 同一道题,一般会有多种解决方法&…...

ACL, ACL Workshop, ACL Findings 解释
ACL(Annual Conference of the Association for Computational Linguistics)是自然语言处理(NLP)领域的顶级会议之一,但确实有多个与ACL相关的会议和出版物,具体如下: ACL Main Conference&…...

《使用Gin框架构建分布式应用》阅读笔记:p272-p306
《用Gin框架构建分布式应用》学习第15天,p272-p306总结,总35页。 一、技术总结 1.TDD(test-driven development) 虽然经常看到TDD这个属于,从本人的工作经历看,实际开发中用得相对较少。 2.unitest(单元测试) go语言开发中&a…...

【搜索引擎】俄罗斯搜索引擎yandex
俄罗斯搜索引擎yandex 1997年,俄罗斯搜索引擎Yandex(俄语意为:语言目录)首次上线,已发展成为全球第四大搜索引擎和第二大非英语搜索引擎 https://yandex.com/...

加密源代码|html代码如何加密保护?3分钟学会4种源代码加密妙招,代码人必看
你是否曾担心过自己的源代码被轻易复制或篡改? 在这个开源和共享盛行的时代,如何加密源代码,成为了每个开发者不得不面对的问题。 古人云:“工欲善其事,必先利其器。”今天,我们就来探讨一下如何加密保护你…...

Jetson Orin NX平台自研载板 IMX477相机掉线问题调试记录
1. 前言 平台: NVIDIA Orin NX 硬件: 自研载板 相机: 3个IMX477树莓派HQ摄像头通过CSI接口连接 版本: L4T 35.4.1(我们也在35.5.0上测试了一些东西) 参数: 30fps,4032x3040 问题描述: 其中一个IMX477相机在录制过程中出现可变时间后退出 短则10秒,长则5小时,…...

spring-boot(整合mybatisplus、及常见注解)
介绍 在日常开发中单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是MybatisPlus. MyBatisPlus是针对于Mybatis框架的增强,即合…...

深度学习:yolov3的使用--建立模型
使用argparse模块来定义和解析命令行参数 创建一个ArgumentParser对象 parser argparse.ArgumentParser() 训练的轮数,每批图像的大小,更新模型参数之前累积梯度的次数,模型定义文件的路径。 parser.add_argument("--epochs", typeint, d…...

关于我、重生到500年前凭借C语言改变世界科技vlog.13——深入理解指针(3)
文章目录 1.字符指针变量2.数组指针变量3.函数指针变量4.函数指针数组5.二维数组传参本质6.拓展补充希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 本章节接着学习常见的指针变量类型 1.字符指针变量 字符指针变量,顾名思义就是字…...

每日算法一练:剑指offer——数组篇(6)
1.点名 某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席,请返回他的学号。 示例 1: 输入: records [0,1,2,3,5] 输出: 4示例 2: 输入: records [0, 1, 2, 3, 4, 5, 6, 8] 输出: 7提示: 1 < records.le…...

【环境搭建】Apache ZooKeeper 3.8.4 Stable
软件环境 Ubuntu 20.04 、OpenJDK 11 OpenJDK 11(如果已经安装,可以跳过这一步) 安装OpenJDK 11: $ sudo apt-get update$ sudo apt-get install -y openjdk-11-jdk 设置 JAVA_HOME 环境变量: $ sudo gedit ~/.bash…...

算法练习——双指针
前言:大佬写博客给别人看,菜鸟写博客给自己看,我是菜鸟。 学前须知(对自己):这里的指针不一定指地址!也可能是数组下标。 1:移动零(双指针) 题目要求: 解题思路&#x…...

vue中el-table显示文本过长提示
1.el-table设置轻提示:show-overflow-tooltip“true“,改变轻提示宽度...

JS 字符串拼接并去重
1、includes 循环数组将某个字段拼接成新的字符串并去重(数组里面包含的一个对象,或者其他都OK) // 定义一个数组 let arr[.......] // 定义拼接的字符串 let a //循环数组将里面某个字段拼接在一起并去重 arr.forEach(item > {if(!a.in…...

opencv 图像预处理
图像预处理 在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,以下是一些常见的图像预处理操作&…...

SAP B1 功能模块字段介绍 - 价格清单(下)
目录 背景 五、业务伙伴的特殊价格 1. 单据逻辑功能 2. 部分字段解释 3. 操作流程 3.1 时间相关 3.2 数量相关 4. 实例 六、复制特殊价格到选择标准 1. 单据逻辑功能 2. 部分字段解释 七、全局更新特殊价格 编辑 1. 单据逻辑功能 2. 部分字段解释 八、价格更…...