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…

启动MySQL服务

在 Windows 系统上&#xff1a; 首先&#xff0c;找到 MySQL 安装目录&#xff0c;一般默认是在 C:\Program Files\MySQL 文件夹下。进入该目录下的 bin 文件夹。找到 mysqld.exe 文件&#xff0c;双击运行它。 在 Linux 系统&#xff08;以 CentOS 为例&#xff09;&#xff…

软考 系统架构设计师系列知识点之软件可靠性基础知识(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…

mysql 意向锁

文章目录 问题锁作用防止死锁提高并发性能问题 先看问题 事务A select * from table where id=1 for update会把id=1这一行锁住 事务B lock table in share mode这时B 想加表级别的共享锁,如果这时想加表级别的共享锁,那就要去挨个检查每行是不是有排它锁 ,这时如果在…

机器学习day3

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

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

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

VUE3与Uniapp 三 (属性绑定)

<template><image :src"pic"></image><!-- 此时loading的false是字符串&#xff0c;不是布尔类型 --><button loading"false">按钮1</button><!-- 此时loading使用了属性绑定&#xff0c;这时的false是布尔类型 --…

python小知识:@property、@setter 使用

在 Python 中&#xff0c;property 是一种装饰器&#xff0c;可以将一个方法转换为属性&#xff0c;使其可以像访问属性一样被调用&#xff0c;而不是像调用方法一样。 使用 property 装饰器可以将一个方法转换为只读属性&#xff0c;也可以通过定义 setter 方法来实现可写属性…

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 的…

【QT进阶】Qt线程与并发之QtConcurrent返回值与run方法的参数说明

往期回顾 【QT进阶】Qt线程与并发之线程和并发的简单介绍-CSDN博客 【QT进阶】Qt线程与并发之创建线程的三种方法(超详细介绍)-CSDN博客 【QT进阶】Qt线程与并发之QtConcurrent的简单介绍-CSDN博客 【QT进阶】Qt线程与并发之QtConcurrent返回值与run方法的参数说明 一、QtConc…

FMU精度问题

1.fmu存在的本质意义是连接来自不同学科的模型&#xff0c;进行多学科协同仿真&#xff0c;提高工作效率并降低开发成本&#xff0c;而不是对求解精度的复现&#xff1b; 2.建模工具的开发语言不确定&#xff0c;但是生成fmu的语言皆为C语言&#xff0c;所以每种开发语言、每款…

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

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

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

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

深度学习模型训练优化:并行化策略与参数拆分技术

目录 并行处理 1. 张量并行(Tensor Parallelism) 工作原理 优点 缺点

Maven的仓库、周期和插件

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

二 SpringMVC接收数据

SpringMVC接收数据 一 访问路径以及指定请求方法 Controller public class UserController {/*** WebSevlet (" 必须以/开头")* RequstMapping(" 不要求 / 开头 ")*1. 精准地址 &#xff0c;多个 ("地址1“&#xff0c;”地址2“)* 2. 支持模糊查询…

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

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

OpenCV实现霍夫变换

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