JavaEE——Spring Boot + jwt

目录

什么是Spring Boot + jwt?

如何实现Spring Boot + jwt:

1. 添加依赖

2、创建JWT工具类

3. 定义认证逻辑

4. 添加过滤器

 5、 http请求测试


什么是Spring Boot + jwt?

Spring Boot和JWT(JSON Web Token)是一对常见的组合,用于构建安全的Web应用程序。下面是它们的主要功能和如何结合使用的概览:

  1. Spring Boot:Spring Boot是一个用于快速构建基于Spring框架的Java应用程序的工具。它通过提供默认配置和约定大于配置的方式,简化了Spring应用程序的开发过程。

  2. JWT(JSON Web Token):JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。JWT通常用于身份验证和信息传输,在Web应用程序中广泛应用。

如何实现Spring Boot + jwt:

1. 添加依赖

① 在你的 Spring Boot 项目中添加 JWT 相关的依赖,比如 jjwt 库,以便于创建和验证 JWT。

       <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

② 确保mybatis、mysql、spring boot、redis、druid、lombok等相关依赖存在

③ maven 刷新下载依赖

2、创建JWT工具类

① 编写一个工具类来处理 JWT 的创建、解析和验证。这个类通常包含以下方法: - 创建 JWT:将用户信息(例如用户名、角色等)加密生成一个 token。

    public static String getToken(Map<String, Object> claims) {// JWT的签发时间long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);// 指定签名的时候使用的签名算法SignatureAlgorithm signatureAlgotithm = SignatureAlgorithm.HS256;long expMillis = nowMillis + 604800000L;        // 默认设置7天过期Date expirationDate = new Date(expMillis);String token = Jwts.builder()               // 创建jwt builder.setClaims(claims)                      // 必须放最前面,不然后面设置的东西都会没有:如setExpiration会没有时间.setId(UUID.randomUUID().toString())     // jwt唯一标识.setIssuedAt(now)                                    // 签发时间.setExpiration(expirationDate)                 // 过期时间.signWith(signatureAlgotithm, key)          // 设置签名实用的签名算法和使用的密钥.compact();return token;}

 ② 编写一个工具类来处理 JWT 的创建、解析和验证。这个类通常包含以下方法: - 解析 JWT:从收到的 token 中提取用户信息

  public static Claims parseJwt(String token) throws Exception {String msg = null;try{Claims claims = Jwts.parser().setAllowedClockSkewSeconds(604800) // 允许7天的偏移.setSigningKey(key)                         // 设置签名密钥.parseClaimsJws(token).getBody(); // 设置需要解析的JWTreturn claims;}catch (SignatureException se) {msg = "密钥错误";log.error(msg, se);throw new RuntimeException(msg);}catch (MalformedJwtException me) {msg = "密钥算法或者密钥转换错误";log.error(msg, me);throw new RuntimeException(msg);}
catch (MissingClaimException mce) {msg = "密钥缺少校验数据";log.error(msg, mce);throw new RuntimeException(msg);}catch (ExpiredJwtException mce) {msg = "密钥已过期";log.error(msg, mce);throw new RuntimeException(msg);}catch (JwtException jwte) {msg = "密钥解析错误";log.error(msg, jwte);throw new RuntimeException(msg);}}

3. 定义认证逻辑

① 在 controller 中,添加 @Slf4j 注解用于日志记录

② 在 controller 中,创建一个 login方法用来控制用户登入

 @PostMapping("/login")public Map<String, Object> login(@RequestBody User user) {log.info("user",user);log.info("用户名: [{}]", user.getName());log.info("密码: [{}]", user.getPwd());User u = userService.login(user);}

③ 在 login中 创新一个Map对象,承载认证结果和相关信息

Map<String, Object> map = new HashMap<>();

④ 如果用户认证成功(u != null),则创建一个包含用户ID和名称的Map对象,并生成一个JWT令牌。接着在响应map中设置状态为true,消息为“认证成功”,并包含了生成的令牌。

⑤ 如果认证失败(u为空),则在响应map中设置状态为false,并包含了一个指示“用户名或者密码错误”的消息。 

try {if (u != null) {Map<String, Object> payLoad = new HashMap<>();payLoad.put("id", u.getId());payLoad.put("name", user.getName());String token = JWTUtils.getToken(payLoad);map.put("state", true);map.put("message", "认证成功");map.put("token",token);} else {map.put("state", false);map.put("message", "用户名或者密码错误");}} catch (Exception e) {map.put("state", false);map.put("msg", e.getMessage());}return map;

4. 添加过滤器

① 创建一个JWTInterceptor过滤器文件来检查传入的请求是否携带有效的 token,并根据需要进行相应的处理

public class JWTInterceptor implements HandlerInterceptor {

 ② 创建preHandle方法,在请求处理之前执行,用于检查传入的请求是否携带有效的 token,并解析令牌

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Map<String, Object> map = new HashMap<>();// 获取请求头中令牌String token = request.getHeader("token");if(!StringUtils.isEmpty(token)) {              try {Claims claims = JWTUtils.parseJwt(token); // 如果找到令牌就使用 JWTUtils.parseJwt() 方法解析令牌return true;                                     // 解析成功,即令牌有效,返回true} catch (RuntimeException e) {          // 如果解析失败,会捕获 RuntimeException 异常e.printStackTrace();map.put("msg", e.getMessage());  // map.put("msg","密钥错误!");}}

③ 将异常信息放入 map 中,并设置一些响应信息,然后将信息以 JSON 格式返回给客户端

        map.put("message","token为null,必须携带token");map.put("state",false);             // 设置状态// 将map 转为 json  jacksonString json = new ObjectMapper().writeValueAsString(map);response.setContentType("application/json;charset=UTF-8");response.getWriter().println(json);return false;}
}

④ 再添加一个拦截器配置类 InterceptorConfig,用于配置和注册拦截器到 Spring MVC 中

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {String[] patterns = new String[] {"/auth/login","/*.html","/css/**","/js/**","/images/**","/layui/**"};    // 添加不拦截的方法registry.addInterceptor(new JWTInterceptor()).addPathPatterns("/**")         // 其他接口token验证.excludePathPatterns(patterns);  // 不进行token验证}
}

 5、 http请求测试

 

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

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

相关文章

苍穹外卖学习

并不包含全部视频内容&#xff0c;大部分都按照操作文档来手搓代码&#xff0c;资料&#xff0c;代码都上传git。 〇、实际代码 0.1 Result封装 package com.sky.result;import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果* param <T>*/ Data pub…

软考 系统架构设计师系列知识点之软件可靠性基础知识(5)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件可靠性基础知识&#xff08;4&#xff09; 所属章节&#xff1a; 第9章. 软件可靠性基础知识 第1节 软件可靠性基本概念 9.1.3 可靠性目标 前文定量分析软件的可靠性时&#xff0c;使用失效强度来表示软件缺陷对…

20232937文兆宇 2023-2024-2 《网络攻防实践》实践七报告

20232937文兆宇 2023-2024-2 《网络攻防实践》实践七报告 1.实践内容 &#xff08;1&#xff09;使用Metasploit进行Linux远程渗透攻击 任务&#xff1a;使用Metasploit渗透测试软件&#xff0c;攻击Linux靶机上的Samba服务Usermap_script安全漏洞&#xff0c;获取目标Linux…

机器学习day3

一、距离度量 1.欧氏距离 2.曼哈顿距离 3.切比雪夫距离 4.闵可夫斯基距离 二、特征与处理 1.数据归一化 数据归一化是一种将数据按比例缩放&#xff0c;使之落入一个小的特定区间的过程。 代码实战 运行结果 2.数据标准化 数据标准化是将数据按照其均值和标准差进行缩放的过…

2024新版计算机网络视频教程65集完整版(视频+配套资料)

今日学计算机网络&#xff0c;众生皆叹难理解。 却见老师神乎其技&#xff0c;网络通畅如云烟。 协议层次纷繁复杂&#xff0c;ARP、IP、TCP、UDP。 路由器交换机相连&#xff0c;数据包穿梭无限。 网络安全重于泰山&#xff0c;防火墙、加密都来添。 恶意攻击时刻存在&#xf…

Visual Studio Code使用

目录 1.python的调试 2.c的运行 方法1&#xff1a; 方法2&#xff1a; 3.c的调试 3.1调试方法一&#xff1a;先生成执行文件&#xff0c;再调试 3.2调试方法二&#xff1a;同时生成执行文件&#xff0c;调试 4.tasks.json 与launch.json文件的参考 4.1C生成执行文件tas…

AI视频教程下载:用ChatGPT和 MERN 堆栈构建 SAAS 项目

这是一个关于 掌握ChatGPT 开发应用的全面课程&#xff0c;它将带领你进入 AI 驱动的 SAAS 项目的沉浸式世界。该课程旨在使你具备使用动态的 MERN 堆栈和无缝的 Stripe 集成来构建强大的 SAAS 平台所需的技能。 你将探索打造智能解决方案的艺术&#xff0c;深入研究 ChatGPT 的…

使用R语言进行简单的主成分分析(PCA)

主成分分析&#xff08;PCA&#xff09;是一种广泛使用的数据降维技术&#xff0c;它可以帮助我们识别数据中最重要的特征并简化复杂度&#xff0c;同时尽量保留原始数据的关键信息。在这篇文章中&#xff0c;我们将通过一个具体的例子&#xff0c;使用R语言实现PCA&#xff0c…

主成分分析(PCA):揭秘数据的隐藏结构

在数据分析的世界里&#xff0c;我们经常面临着处理高维数据的挑战。随着维度的增加&#xff0c;数据处理、可视化以及解释的难度也随之增加&#xff0c;这就是所谓的“维度的诅咒”。主成分分析&#xff08;PCA&#xff09;是一种强大的统计工具&#xff0c;用于减少数据的维度…

Maven的仓库、周期和插件

一、简介 随着各公司的Java项目入库方式由老的Ant改为Maven后&#xff0c;相信大家对Maven已经有了个基本的熟悉。但是在实际的使用、入库过程中&#xff0c;笔者发现挺多人对Maven的一些基本知识还缺乏了解&#xff0c;因此在此处跟大家简单地聊下Maven的相关内容&#xff0c…

基于STM32单片机的天然气与温湿度检测报警系统设计

基于STM32单片机的天然气与温湿度检测报警系统设计 一、引言 随着科技的发展和安全生产意识的提高&#xff0c;对于地下矿井等封闭环境中的天然气泄漏和温湿度变化的监控变得尤为重要。本文设计了一种基于STM32单片机的天然气与温湿度检测报警系统&#xff0c;旨在实时监控环…

OpenCV实现霍夫变换

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 如何实现边缘检测器 下一篇 :OpenCV 实现霍夫圆变换 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 HoughLines()和 HoughLinesP()检测图像中的线条。…

Error opening file a bytes-like object is required,not ‘NoneType‘

错误显示&#xff0c;打开的是一个无效路径的文件 查看json文件内容&#xff0c;索引的路径与json文件保存的路径不同 方法&#xff1a;使用python脚本统一修改json文件路径 import json import os import argparse import cv2 from tqdm import tqdm import numpy as np impo…

python爬虫学习------scrapy第二部分(第三十天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

10、了解JVM判断对象可回收的神秘法则!

10.1、垃圾回收触发时机? 在我们之前的学习中,我们已经了解到,当我们的系统在运行过程中创建对象时,这些对象通常会被优先分配在所谓的“新生代”内存区域,如下图所示。 在新生代中,当对象数量逐渐增多,接近填满整个空间时,会触发垃圾回收机制。这个机制的作用是回收…

LabVIEW专栏七、队列

目录 一、队列范例二、命令簇三、队列应用1.1、并行循环队列1.2、命名队列和匿名队列1.2.1、命名队列1.2.2、匿名队列 1.3、长度为1的队列 队列是一种特殊的线性表&#xff0c;就是队列里的元素都是按照顺序进出。 队列的数据元素又称为队列元素。在队列中插入一个队列元素称为…

Boot过程相关镜像详解:IVT、DCD、App Boot镜像到底是什么?

《S32G3系列芯片——Boot详解》系列——Boot过程相关镜像详解&#xff1a;IVT、DCD、App Boot镜像到底是什么&#xff1f; 一、概述二、 IVT镜像2.1 IVT header的结构2.2 BCW和LCW的结构2.3 最后16个字节GMAC的概念 三、DCD镜像3.1 DCD相关的基本概念3.2 DCD header的结构3.3 D…

Java使用IText根据pdf模板创建pdf文件

1.导包 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-as…

jvm知识点总结(二)

Java8默认使用的垃圾收集器是什么? Java8版本的Hotspot JVM,默认情况下使用的是并行垃圾收集器&#xff08;Parallel GC&#xff09; 如果CPU使用率飙升&#xff0c;如何排查? 1.先通过top定位到消耗最高的进程id 2.执行top -h pid单独监控该进程 3.在2中输入H&#xff…

【树莓派】yolov5 Lite,目标检测,行人检测入侵报警

延续之前的程序&#xff1a; https://qq742971636.blog.csdn.net/article/details/138172400 文章目录 播放声音pygame不出声音怎么办&#xff08;调节音量&#xff09;树莓派上的音乐播放器&#xff08;可选&#xff09;命令行直接放歌&#xff08;尝试放mp3歌曲&#xff09; …