JWT工具类,SpringBoot整合Jwt使用

引入依赖

		<!-- JWT依赖 --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><!-- JWT相关依赖,jdk1.8以上版本还需引入以下依赖 --><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>3.0.2</version></dependency><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-core</artifactId><version>3.0.2</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency>

示例

复制下拉即可测试使用了

package xx.convert.util;import io.jsonwebtoken.*;import java.util.Date;
import java.util.UUID;/*** Jwt-token工具类* @author yyq*/
public class JwtUtil {private static long expire_time = 2000 ; // 2秒是做测试用的(设置一个钟 1000 * 60 * 60 * 1)private static String sign = "AsldjlJDLKKJSDKLFJlksjlkjlkSDL"; // 加密签名密钥/*** 创建token返回* @return*/public static String createToken() {// 创建一个JwtBuilder对象JwtBuilder jwtBuilder = Jwts.builder();// jwtToken -> abc.def.xyzString jwtToken = jwtBuilder// Header:头部.setHeaderParam("typ", "JWT").setHeaderParam("alg", "HS256")// PayLoad:载荷(用户信息,就是需要保存的数据).claim("userId", "101").claim("userName", "zhangsan").claim("roleName", "admin").setSubject("user-info") // 这个载荷的名称// Token的过期时间.setExpiration(new Date(System.currentTimeMillis() + expire_time)) // 从当前系统时间往后存活一小时// id字段.setId(UUID.randomUUID().toString())// 设置加密算法和签名.signWith(SignatureAlgorithm.HS256, sign)// 使用”."连接成一个完整的字符串.compact();return jwtToken;}/*** 获取解析的用户信息* @param token* @return Claims*/public static Claims parserJwt(String token){if (token == null || token.trim().length() == 0){return null;}Jws<Claims> jws = Jwts.parser().setSigningKey(sign).parseClaimsJws(token);return jws.getBody(); // 存储的用户信息}/*** 获取解析的用户ID* @param token* @return*/public static String parserJwtById(String token){if (token == null || token.trim().length() == 0){return "";}Jws<Claims> jws = Jwts.parser().setSigningKey(sign).parseClaimsJws(token);return (String)jws.getBody().get("userId"); // 存储的用户信息}/*** 校验token* @param token* @return*/public static boolean checkToken(String token){if (token == null || token.trim().length() == 0){return false;}try{Jwts.parser().setSigningKey(sign).parseClaimsJws(token);}catch (Exception e){e.printStackTrace();return false;}return true;}/*** 开始测试* @param args* @throws InterruptedException*/public static void main(String[] args) throws InterruptedException {System.out.println("------------------------------【创建token】---------------------------");String token = JwtUtil.createToken();System.out.println(token);System.out.println("------------------------------【第一次解析】---------------------------");boolean b = JwtUtil.checkToken(token);System.out.println(b);if(b){Claims claims = parserJwt(token);System.out.println(claims.getExpiration());System.out.println(claims.getSubject());System.out.println(claims.get("userId"));System.out.println(claims.get("userName"));System.out.println(claims.get("roleName"));}else {System.out.println("========token失效=========");}System.out.println("------------------------------【延迟3秒】---------------------------");Thread.sleep(3000);System.out.println("------------------------------【第二次解析】---------------------------");b = JwtUtil.checkToken(token);System.out.println(b);if(b){Claims claims = parserJwt(token);System.out.println(claims.getExpiration());System.out.println(claims.getSubject());System.out.println(claims.get("userId"));System.out.println(claims.get("userName"));System.out.println(claims.get("roleName"));}else {System.out.println("========token失效=========");}}}

实际项目使用

拦截器
关键preHandle方法,其他附带的

package xx.convert.util;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 拦截器* @author yyq*/
@Component
public class MyInterceptor implements HandlerInterceptor {/*** 执行前* @param arg0* @param arg1* @param arg2* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {// 请求路径,如需指定,则判断校验String url = arg0.getRequestURI();if(url.indexOf("views") != -1){String token = arg0.getHeader("token");boolean b = JwtUtil.checkToken(token);if(!b){return false;}else {String userId = JwtUtil.parserJwtById(token);arg0.setAttribute("userId", userId);}}return true;}/*** 执行后* @param arg0* @param arg1* @param arg2* @param arg3* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {// TODO Auto-generated method stub}/*** 页面渲染* @param arg0* @param arg1* @param arg2* @param arg3* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {// TODO Auto-generated method stub}}

跨越问题解决

关键addCorsMappings方法,其他附带的

package xx.convert.util;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 视图处理器** @author yyq*/
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {@Value("${file.upload.path}")private String uploadFolder = "D://nginx//projectName//";@Autowiredprivate MyInterceptor myInterceptor;/*** 跨越问题解决* @param registry*/@Overridepublic void addCorsMappings(CorsRegistry registry) {// 为url添加映射路径(配置域名下的资源)registry.addMapping("/**")// 配置允许访问的源,*表示允许全部域名。(小于springboot 2.4版本).allowedOrigins("*")// 如果版本高于springboot 2.4,则使用//.allowedOriginPatterns("*")// 设置允许的请求方式.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")// 设置允许的header.allowedHeaders("*")// 设置是否允许发送Cookie,用于凭证请求,默认不发送cookie。.allowCredentials(true)// 设置预检请求的有效时间.maxAge(3600);}/*** 静态文件路径设置** @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// String path1 = ResourceUtils.getURL("classpath:").getPath();// String path2 = ClassUtils.getDefaultClassLoader().getResource("").getPath();registry.addResourceHandler("/**").addResourceLocations("classpath:/static/", "file:" + uploadFolder);// 上传的图片代理文件夹路径registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");}/*** 拦截器配置** @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/**");//所有请求都被拦截,包括静态资源/*registry.addInterceptor(new InterceptorConfig()).addPathPatterns("/**")//所有请求都被拦截,包括静态资源.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**");//放行的请求*/}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决jupyter notebook可以使用pytorch而Pycharm不能使用pytorch的问题

之前我是用的这个目录下的Python 开始更新目录 1、 2、 3、

使用Python内置模块加速SQL查询

大家好&#xff0c;假设你正在查阅一本书的页面&#xff0c;你想要更快地找到你正在寻找的信息。那么你可能会查找术语索引&#xff0c;然后跳转到引用特定术语的页面&#xff0c;SQL中的索引与书籍中的索引工作原理类似。 在大多数实际系统中&#xff0c;都将对包含大量行的数…

【javaweb】学习日记Day6 - Mysql 数据库 DDL DML

之前学习过的SQL语句笔记总结戳这里→【数据库原理与应用 - 第六章】T-SQL 在SQL Server的使用_Roye_ack的博客-CSDN博客 目录 一、概述 1、如何安装及配置路径Mysql&#xff1f; 2、SQL分类 二、DDL 数据定义 1、数据库操作 2、IDEA内置数据库使用 &#xff08;1&…

Python3 列表

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 Python 有 6 个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表都可以进…

飞腾uboot命令简单介绍

飞腾uboot和开源uboot并无大差异,故飞腾uboot固件命令可以直接从网上搜索开源uboot相关命令。 这里为了便于大家调试,将一些可能用到的命令说明一下。 在 Uboot 命令行下,输入 help 将打印所有的可用命令,复杂命令操作,通过命令 help 的方式获取具体说明。 1.help命令 …

时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价)

时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价) 目录 时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价)效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现DBN-SVM深度置信网络结合支持向量机…

校招算法题实在不会做,有没有关系?

文章目录 前言一、校招二、时间复杂度1、单层循环2、双层循环 三、空间复杂度四、数据结构五、校招算法题实在不会做&#xff0c;有没有关系&#xff1f;六、英雄算法集训 前言 英雄算法联盟八月集训 已经接近尾声&#xff0c;九月算法集训将于 09月01日 正式开始&#xff0c;目…

.NET 8 Preview 7 中的 ASP.NET Core 更新

作者&#xff1a;Daniel Roth 排版&#xff1a;Alan Wang .NET 8 Preview 7 现在已经发布&#xff0c;其中包括了对 ASP.NET Core 的许多重要更新。 以下是预览版本中新增功能的摘要&#xff1a; 服务器和中间件 防伪中间件 API 编写 最小 API 的防伪集成 Native AOT 请求委托…

市值暴跌后,每日优鲜能否靠2亿融资“续命”?

濒临破产退市的每日优鲜&#xff0c;靠转型实现“自救”&#xff1f; 作为“生鲜电商第一股”&#xff0c;每日优鲜在上市1年后爆发生存危机。 8月4日&#xff0c;每日优鲜(NDAQ:MF)公布了2022年报&#xff0c;尽管去年7月其宣布关闭营收占比约90%的DWM业务&#xff0c;全面终…

Kafka 消费者“group_name”组正在永远重新平衡

目录 一、场景1.1、场景应用环境1.2、 问题重现二、问题分析三、解决方案一、场景 1.1、场景应用环境 卡夫卡:2.11-1.0.1。主题:并发度为 5 且分区为 5 。1.2、 问题重现 当应用程序重新启动并且在分区分配之前在主题上发布消息时,主题的 5 个消费者找到组协调器并向组协调…

如何对MySQL和MariaDB中的查询和表进行优化-提升查询效率

前言 MySQL和MariaDB是数据库管理系统的流行选择。两者都使用SQL查询语言来输入和查询数据。 尽管SQL查询是简单易学的命令&#xff0c;但并不是所有的查询和数据库函数都具有相同的效率。随着你存储的信息量的增长&#xff0c;如果你的数据库支持一个网站&#xff0c;随着网…

【80天学习完《深入理解计算机系统》】第十一天 3.5 过程(函数调用)

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

RK3568 安卓源码编译

一.repo安卓编译工具 项目模块化/组件化之后各模块也作为独立的 Git 仓库从主项目里剥离了出去&#xff0c;各模块各自管理自己的版本。Android源码引用了很多开源项目&#xff0c;每一个子项目都是一个Git仓库&#xff0c;每个Git仓库都有很多分支版本&#xff0c;为了方便统…

gradio使用transformer模块demo介绍2:Images Computer Vision

文章目录 图像分类 Image Classification图像分割 Image Segmentation图像风格变换 Image Transformation with AnimeGAN3D模型 3D models 图像分类 Image Classification import gradio as gr import torch import requests from torchvision import transformsmodel torch.…

【Unity3D赛车游戏】【六】如何在Unity中为汽车添加发动机和手动挡变速?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【【STM32分析IO该设置什么模式的问题】】

STM32分析IO该设置什么模式的问题 我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉&#xff0c;但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以…

龙芯2K1000LA移植交叉编译环境以及QT

嵌入式大赛结束了&#xff0c;根据这次比赛中记的凌乱的笔记&#xff0c;整理了一份龙芯2K1000LA的环境搭建过程&#xff0c;可能笔记缺少了一部分步骤或者错误&#xff0c;但是大致步骤可以当作参考。 一、交叉编译工具链 下载连接&#xff1a;龙芯 GNU 编译工具链 | 龙芯开…

几个nlp的小项目(文本分类)

几个nlp的小项目(文本分类) 导入加载数据类、评测类查看数据集精确展示数据测评方法设置参数tokenizer,token化的解释对数据集进行预处理加载预训练模型进行训练设置训练模型的参数一个根据任务名获取,测评方法的函数创建预训练模型开始训练本项目的工作完成了什么任务?导…

Flask 单元测试

如果一个软件项目没有经过测试&#xff0c;就像做的菜里没加盐一样。Flask 作为一个 Web 软件项目&#xff0c;如何做单元测试呢&#xff0c;今天我们来了解下&#xff0c;基于 unittest 的 Flask 项目的单元测试。 什么是单元测试 单元测试是软件测试的一种类型。顾名思义&a…

extern “C”关键字的作用

目录 概述C和C在函数调用和变量命名等方面的差异示例总结 概述 extern "C"是用于在C中声明使用C语言编写的函数和变量的关键字。C和C在函数调用和变量命名等方面存在一些差异&#xff0c;为了在C代码中正确地使用C语言的函数和变量&#xff0c;需要使用extern "…