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

SpringBoot2-Jwt

1.官网

jwt.io/libraries

2.选jose4j

    pom

<dependency><groupId>org.bitbucket.b_c</groupId><artifactId>jose4j</artifactId><version>0.9.4</version>
</dependency>

3.创建jwt工具

public class JwtUtil {private static  String secret = "e0e775bfcad04ecc94807b028dfca4d5";// "12345678123456781234567812345678"; // 注意密钥长短(最少32个字符)private static String Issuer = "QiXiao";private static String Audience = "WangPeng";public static String CreateToken(UserEntity user)  {try {JsonWebSignature jws = new JsonWebSignature();//ClaimJwtClaims claims = new JwtClaims();claims.setIssuer(Issuer);  // who creates the token and signs itclaims.setAudience(Audience); // to whom the token is intended to be sentclaims.setExpirationTimeMinutesInTheFuture(10); // 过期时间claims.setGeneratedJwtId();                     // 为 JWT 设置一个自动生成的唯一 IDclaims.setIssuedAtToNow();                      // 设置 Token 发布/创建 时间为当前时间claims.setNotBeforeMinutesInThePast(2);         // 设置生效时间为 2 分钟前claims.setSubject("Bearer"); // the subject/principal is whom the token is aboutclaims.setClaim("UserSN", user.getSN());claims.setClaim("email","wang_peng_yl@126.com"); // additional claims/attributes about the subject can be addedjws.setPayload(claims.toJson());//Headerjws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256);jws.setHeader("typ", "JWT");//签名Key hmacKey = CreateKey();jws.setKey(hmacKey);jws.setDoKeyValidation(false);String jwt = jws.getCompactSerialization();System.out.println(jwt);return jwt;}catch (JoseException ex){throw new RuntimeException(ex.getMessage());}}private static Key CreateKey(){Key hmacKey = new HmacKey(secret.getBytes());return hmacKey;}public static JwtClaims ValidateToken(String jwt) throws MalformedClaimException {String message = "";Key key = CreateKey();JwtClaims jwtClaims = new JwtClaims();// 验证令牌JwtConsumer jwtConsumer = new JwtConsumerBuilder().setAllowedClockSkewInSeconds(30).setRequireExpirationTime()     // 必须设置过期时间.setRequireSubject()            // 必须设置 Subject.setExpectedIssuer(Issuer)    // 必须设置 Token 签发者.setExpectedAudience(Audience)// 必须设置 Token 签发给谁.setVerificationKey(key)    // 设置用于验证签名的公钥// 设置允许的预期签名算法.setJwsAlgorithmConstraints(AlgorithmConstraints.ConstraintType.WHITELIST, AlgorithmIdentifiers.HMAC_SHA256).build();try {jwtClaims = jwtConsumer.processToClaims(jwt);}catch(InvalidJwtException e){jwtClaims = new JwtClaims();message = handleException(e);jwtClaims.setClaim("error", message);}return jwtClaims;}private static String handleException(InvalidJwtException e){String message = "";try {JwtClaims jwtClaims = e.getJwtContext().getJwtClaims();List<ErrorCodeValidator.Error> errorDetails = e.getErrorDetails();// 异常是否因 JWT 过期触发if (e.hasExpired()){message = "token已经过期, 过期时间在" + jwtClaims.getExpirationTime();}// 异常是否因 Audience 无效触发if(e.hasErrorCode(ErrorCodes.AUDIENCE_INVALID)){message = "无效audience:" + jwtClaims.getAudience();}// 异常是否因缺少 Audience 触发if (e.hasErrorCode(ErrorCodes.AUDIENCE_MISSING)) {message = "Audience丢失";}// 异常是否因缺少过期时间触发if (e.hasErrorCode(ErrorCodes.EXPIRATION_MISSING)) {message = "缺少过期时间";}// 异常是否因过期时间太长触发if (e.hasErrorCode(ErrorCodes.EXPIRATION_TOO_FAR_IN_FUTURE)) {message = "过期时间太";}// 异常是否因缺乏完整性触发if (e.hasErrorCode(ErrorCodes.INTEGRITY_MISSING)) {message = "缺乏完整性";}// 异常是否因发布时间无效触发if (e.hasErrorCode(ErrorCodes.ISSUED_AT_INVALID_FUTURE) || e.hasErrorCode(ErrorCodes.ISSUED_AT_INVALID_PAST)) {message = "发布时间无效:" + jwtClaims.getIssuedAt();}// 异常是否因缺少发布时间触发if (e.hasErrorCode(ErrorCodes.ISSUED_AT_MISSING)) {message = "缺少发布时间:";}// 异常是否因签发者无效触发if (e.hasErrorCode(ErrorCodes.ISSUER_INVALID)) {message = "签发者无效:" + jwtClaims.getIssuer();}// 异常是否因缺少签发者触发if (e.hasErrorCode(ErrorCodes.ISSUER_MISSING)) {message = "缺少签发者";}// 异常是否因 JSON 无效触发if (e.hasErrorCode(ErrorCodes.JSON_INVALID)) {message = "JSON 无效";}// 异常是否因缺少 JWT ID 触发if (e.hasErrorCode(ErrorCodes.JWT_ID_MISSING)) {message = "缺少 JWT ID";}// 异常是否因 JwtClaims 格式错误触发if (e.hasErrorCode(ErrorCodes.MALFORMED_CLAIM)) {message = "JwtClaims 格式错误";}// 异常是否因缺少生效时间触发if (e.hasErrorCode(ErrorCodes.NOT_BEFORE_MISSING)) {message = "缺少生效时间";}// 异常是否因 Token 尚未生效触发if (e.hasErrorCode(ErrorCodes.NOT_YET_VALID)) {message = "Token 尚未生效";}// 异常是否因 Token 的 Signature 部分无效触发if (e.hasErrorCode(ErrorCodes.SIGNATURE_INVALID)) {message = "Token 的 Signature 部分无效";}// 异常是否因 Token 的 Signature 部分缺失触发if (e.hasErrorCode(ErrorCodes.SIGNATURE_MISSING)) {message = "Token 的 Signature 部分缺失";}// 异常是否因 Subject 无效触发if (e.hasErrorCode(ErrorCodes.SUBJECT_INVALID)) {message = "Subject 无效";}// 异常是否因 Subject 缺失触发if (e.hasErrorCode(ErrorCodes.SUBJECT_MISSING)) {message = "Subject 缺失";}// 异常是否因 Type 无效触发if (e.hasErrorCode(ErrorCodes.TYPE_INVALID)) {message = "Type 无效";}// 异常是否因 Type 缺失触发if (e.hasErrorCode(ErrorCodes.TYPE_MISSING)) {message = "Type 缺失";}if(message == ""){message = e.getMessage();}}catch (MalformedClaimException e1) {message = e.getMessage();}return message;}
}

4.CreateToken方法在登录时用

5.验证token的方法ValidateToken在拦截器用

public class JwtHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {boolean bOK = HandlerInterceptor.super.preHandle(request, response, handler);String header = request.getHeader("Authorization");// 请求头不为空进行解析if (StringUtils.isNotBlank(header) && header.startsWith("Bearer ")) {// 得到令牌String jwt = header.substring(7);JwtClaims jwtClaims = JwtUtil.ValidateToken(jwt);Object msg = jwtClaims.getClaimValue("error");if(msg != null){response.setContentType("text/html;charset=UTF-8");response.getWriter().write((String) msg);}else{Map<String,Object> map = new HashMap<>();map.put("UserSN", jwtClaims.getClaimValue("UserSN"));request.setAttribute("UserInfo", map);}return msg == null;}return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

6.获取UserSN

Controller里要用到token的UserSN,通过RequestContextHolder可以获取,创建WebUtil


import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.util.Map;public class WebUtil {private static HttpServletRequest request;static{if(request == null){request =  ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();}}public static long getUserSN(){Object attribute = request.getAttribute("UserInfo");if(attribute != null && attribute instanceof Map){Map<String,Object> map =   (Map<String,Object>)attribute;return (long) map.get("UserSN");}return 0;}
}

7.

相关文章:

SpringBoot2-Jwt

1.官网 jwt.io/libraries 2.选jose4j pom <dependency><groupId>org.bitbucket.b_c</groupId><artifactId>jose4j</artifactId><version>0.9.4</version> </dependency> 3.创建jwt工具 public class JwtUtil {private stat…...

2、安全开发-Python-Socket编程端口探针域名爆破反弹Shell编码免杀

用途&#xff1a;个人学习笔记&#xff0c;欢迎指正&#xff01; 目录 主要内容&#xff1a; 一、端口扫描(未开防火墙情况) 1、Python关键代码: 2、完整代码&#xff1a;多线程配合Queue进行全端口扫描 二、子域名扫描 三、客户端&#xff0c;服务端Socket编程通信cmd命…...

Python 套接字详解:与网络通信的温柔邂逅

网络世界&#xff0c;犹如一片无垠的海洋&#xff0c;充满了无限的可能性和无尽的探索。而在这个浩瀚的网络宇宙中&#xff0c;Python 语言以其简洁优雅、功能丰富而备受青睐。在 Python 的世界里&#xff0c;有一个神奇的工具&#xff0c;它就像是一座桥梁&#xff0c;将不同的…...

如何在Linux系统中安装MySQL

要在Linux系统中安装MySQL&#xff0c;您可以使用系统的包管理工具。以下是一些常见的Linux发行版的安装命令&#xff1a; 1. **Ubuntu/Debian:** bash sudo apt-get update sudo apt-get install mysql-server 2. **Fedora:** bash sudo dnf install mysql-server 3. **Cent…...

51单片机基础:定时器

1.定时器介绍 51单片机通常有两个定时器&#xff1a;定时器 0/1&#xff0c;好一点的可能有定时器3。 在介绍定时器之前我们先科普下几个知识&#xff1a; 1&#xff0c;CPU 时序的有关知识 ①振荡周期&#xff1a;为单片机提供定时信号的振荡源的周期&#xff08;晶振周期或…...

高速接口PCB布局指南(五)高速差分信号布线(三)

高速接口PCB布局指南&#xff08;五&#xff09;高速差分信号布线&#xff08;三&#xff09; 1.表面贴装器件焊盘不连续性缓解2.信号线弯曲3.高速信号建议的 PCB 叠层设计4.ESD/EMI 注意事项5.ESD/EMI 布局规则 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 …...

MySQL使用报错1045 - Access denied for user ‘root‘@‘localhost‘ (using password: YES)

问题描述 设备&#xff1a;MacBook Pro macOS Monterey 12.1 MySQL版本&#xff1a;8.0.27 arm-64 描述&#xff1a;在使用Navicat连接电脑本地的数据库时&#xff0c;发现连接不上了&#xff0c;报了个错误1045 - Access denied for user rootlocalhost (using password: YES)…...

UE4 C++创建摄像机摇臂和相机并且设置Transform

新建MyPawn C类 .h #include "GameFramework/SpringArmComponent.h" //SpringArm组件 #include "Camera/CameraComponent.h" //Camera组件class 工程名称_API AMyPawn : public APawn { //定义组件变量 public:UPROPERTY(VisibleAnywhere, BlueprintRead…...

<网络安全>《14 日志审计系统》

1 概念 日志审计系统是用于全面收集企业IT系统中常见的安全设备、网络设备、数据库、服务器、应用系统、主机等设备所产生的日志&#xff08;包括运行、告警、操作、消息、状态等&#xff09;并进行存储、监控、审计、分析、报警、响应和报告的系统。 日志审计系统是一种用于…...

嵌入式软件设计方式与方法

1、嵌入式软件与设计模式 思从深而行从简 软件开发&#xff0c;难的不是编写软件&#xff0c;而是编写功能正常的软件。软件工程化才能保证软件质量和项目进度&#xff0c;而设计模式使代码开发真正工程化&#xff0c;设计模式是软件工程的基石。 所谓设计模式就是对常见问题的…...

ELAdmin 前端启动

开发工具 官方指导的是使用WebStorm&#xff0c;但是本人后端开发一枚&#xff0c;最终还是继续使用了 idea&#xff0c;主打一个能用就行。 idea正式版激活方式&#xff1a; 访问这个查找可用链接&#xff1a;https://3.jetbra.in/进入任意一个能用的里面&#xff0c;顶部提…...

完全让ChatGPT写一个风格迁移的例子,不改动任何代码

⭐️ 前言 小编让ChatGPT写一个风格迁移的例子&#xff0c;注意注意&#xff0c;代码无任何改动&#xff0c;直接运行&#xff0c;输出结果。 额。。。。这不是风格转换后的结果图。 ⭐️ 风格迁移基本原理 风格迁移是一种计算机视觉领域的图像处理技术&#xff0c;它的目标…...

查看jar包编译的jdk版本

解压jar包 jar xf xxx.jar 查看对象 javap -v Myclassname javap -v KafkaProducer.class |grep version -C 3 J2SE 8.0 52(0x33 hex) J2SE 7.0 51(0x32 hex) J2SE 6.0 50 (0x32 hex) J2SE 5.0 49 (0x31 hex) JDK 1.4 48 (0x30 hex) JDK 1.3 47 (0x2F hex) JDK 1.2 46 …...

未来之梦:畅想人工智能操控手机的辉煌时代

引言&#xff1a; 在当今数字化快速发展的时代&#xff0c;人工智能技术正日益深入我们的生活。其中&#xff0c;手机作为人们日常生活不可或缺的一部分&#xff0c;其未来将如何受到人工智能技术的影响&#xff0c;引发了广泛的关注和研究。本文将深入探讨人工智能操控手机的…...

产品经理--分享在项目中产品与研发之间会遇到的问题 在面试这一岗位时,面试官常问的问题之一,且分享两大原则来回答面试官这一问题

目录 一.STAR原则 1.1 简介 1.2 如何使用 1.3 举例说明 二.PDCA原则 2.1 简介 2.2 如何使用 2.3 运用场景 2.4 举例说明 三.产品与研发的沟通痛点 3.1 沟通痛点的原因 3.2 分享案例 前言 本篇会详细阐明作为一个产品经理会在项目遇到的问题&#xff0c;如&#xff1a;产…...

node环境打包js,webpack和rollup两个打包工具打包,能支持vue

引言 项目中经常用到共用的js&#xff0c;这里就需要用到共用js打包&#xff0c;这篇文章讲解两种打包方式&#xff0c;webpack打包和rollup打包两种方式 1、webpack打包js 1.1 在根目录创建 webpack.config.js&#xff0c;配置如下 const path require(path); module.expo…...

图数据库 之 Neo4j - 图数据库基础(2)

图数据库是一种专门用于存储、管理和查询图数据的数据库。与传统的关系型数据库不同&#xff0c;图数据库以图的形式存储数据&#xff0c;其中节点表示实体&#xff0c;边表示实体之间的关系。这种图数据模型非常适合表示复杂的关系和连接。 图数据库的定义和特点 图数据库是一…...

20240202在Ubuntu20.04.6下配置环境变量之后让nvcc --version显示正常

20240202在Ubuntu20.04.6下配置环境变量之后让nvcc --version显示正常 2024/2/2 20:19 在Ubuntu20.04.6下编译whiper.cpp的显卡模式的时候&#xff0c;报告nvcc异常了&#xff01; 百度&#xff1a;nvcc -v nvidia-cuda-toolkit rootrootrootroot-X99-Turbo:~/whisper.cpp$ WH…...

数字孪生网络攻防模拟与城市安全演练

在数字化浪潮的推动下&#xff0c;网络攻防模拟和城市安全演练成为维护社会稳定的不可或缺的环节。基于数字孪生技术我们能够在虚拟环境中进行高度真实的网络攻防模拟&#xff0c;为安全专业人员提供实战经验&#xff0c;从而提升应对网络威胁的能力。同时&#xff0c;在城市安…...

LeetCode、62.不同路径的数目(一)【简单,动态规划或递归】

文章目录 前言LeetCode、62.不同路径的数目(一)【简单&#xff0c;动态规划或递归】题目描述与分类思路思路1&#xff1a;动态规划思路2&#xff1a;递归实现简洁写法补充&#xff1a;2024.1.30 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、…...

新手必看:用Cisco Packet Tracer一步步配置VLAN(附常见错误排查)

从零开始掌握Cisco Packet Tracer中的VLAN配置&#xff1a;完整指南与避坑手册 在计算机网络的学习和实践中&#xff0c;虚拟局域网(VLAN)技术是每个网络工程师必须掌握的核心技能之一。无论你是正在准备CCNA认证的学生&#xff0c;还是需要为企业部署网络架构的IT专业人员&…...

用华为ENSP模拟器复现智慧小区网络:从VLAN划分到三层架构的保姆级配置教程

华为ENSP模拟器实战&#xff1a;智慧小区网络从零搭建全流程指南 当你第一次拿到智慧小区网络设计方案时&#xff0c;那些抽象的拓扑图和配置参数是否让你望而生畏&#xff1f;作为网络工程师成长路上的必经之路&#xff0c;企业级网络搭建从来不是纸上谈兵的游戏。本文将带你用…...

ZYNQ XADC保姆级教程:不写PL代码,用PS接口3分钟读取芯片温度电压

ZYNQ XADC极简实战&#xff1a;纯PS端3行代码监控芯片健康状况 刚拿到ZYNQ开发板时&#xff0c;我最先好奇的是这颗芯片的"生命体征"——它现在多少度&#xff1f;供电稳定吗&#xff1f;传统FPGA需要外接传感器才能获取这些数据&#xff0c;而ZYNQ内置的XADC模块让这…...

OpenClaw多模型切换指南:Qwen3-32B与其他镜像协同工作

OpenClaw多模型切换指南&#xff1a;Qwen3-32B与其他镜像协同工作 1. 为什么需要多模型切换&#xff1f; 去年冬天&#xff0c;当我第一次尝试用OpenClaw自动化处理公司周报时&#xff0c;发现单一模型很难同时满足"数据分析"和"文案润色"两种需求。Qwen…...

如何通过AndroidAnnotations与Kotlin扩展函数实现极速Android开发:新手必备指南

如何通过AndroidAnnotations与Kotlin扩展函数实现极速Android开发&#xff1a;新手必备指南 【免费下载链接】androidannotations Fast Android Development. Easy maintainance. 项目地址: https://gitcode.com/gh_mirrors/an/androidannotations AndroidAnnotations是…...

告别Electron臃肿!用Tauri 2.0 + Rust打造你的第一个轻量级桌面应用(附完整项目结构解析)

从Electron到Tauri 2.0&#xff1a;用Rust重构现代桌面应用开发范式 当Electron应用体积膨胀到200MB起步时&#xff0c;我们不得不重新思考桌面开发的未来。Tauri 2.0的出现绝非偶然——这是前端开发者对性能与体验的集体觉醒。本文将带你深入这个基于Rust的轻量级框架&#xf…...

从随机采样到精准决策:蒙特卡罗方法在复杂系统建模中的实践

1. 蒙特卡罗方法&#xff1a;用随机性破解复杂世界的密码 想象你是一位古代数学家&#xff0c;手里只有一把沙子和一块画着方格的石板。现在要计算一个不规则形状的湖泊面积&#xff0c;你会怎么做&#xff1f;最原始的方法可能是把沙子均匀撒在石板上&#xff0c;然后数出落在…...

深入解析Cache工作原理与多核一致性机制

深入理解Cache工作原理与技术实现1. 计算机体系中的Cache基础1.1 Cache存在的必要性现代计算机系统中&#xff0c;处理器性能与存储器访问性能之间存在显著差距。从历史发展数据来看&#xff0c;CPU计算性能每18个月翻一番&#xff08;遵循摩尔定律&#xff09;&#xff0c;而D…...

效率飙升:用快马生成可复用的wsl环境配置脚本,告别重复劳动

最近在团队协作和更换设备时&#xff0c;经常需要重复配置WSL开发环境&#xff0c;每次都要手动执行一堆命令&#xff0c;不仅耗时还容易遗漏步骤。经过多次实践&#xff0c;我总结出一套用脚本自动化配置的方法&#xff0c;现在通过InsCode(快马)平台就能快速生成可复用的环境…...

例子-子网划分问题

...