SpringBoot集成JWT基础使用

目录

    • 一.接口统一前缀设置
    • 二.JWT POM依赖
    • 三.JWT工具类TokenUtils.java
    • 四.拦截器JwtInterceptor.java
    • 五.拦截器设置
    • 六.设置自定义头配置

一.接口统一前缀设置

1.指定controller统一的接口前缀
2.加自定义拦截器JwtInterceptor,设置拦截规则,指定Login接口放行,不需验证token

import com.example.wenxin.constant.Jwt.JwtInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /*** @program: wenxin* @ClassName WebConfig* @description:  指定controller统一的接口前缀* @create: 2024-03-29 15:58* @Version 1.0**/
@Configuration
public class WebConfig implements WebMvcConfigurer {@AutowiredJwtInterceptor jwtInterceptor;@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {// 指定controller统一的接口前缀configurer.addPathPrefix("/api", clazz -> clazz.isAnnotationPresent(RestController.class));}// 加自定义拦截器JwtInterceptor,设置拦截规则@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor).addPathPatterns("/api/**").excludePathPatterns("/api/user/login");}}

二.JWT POM依赖

		<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.4.0</version></dependency>

三.JWT工具类TokenUtils.java


import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.example.wenxin.entity.User;
import com.example.wenxin.service.UserService;
import jakarta.annotation.PostConstruct;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import java.util.Date;/*** @program: wenxin* @ClassName TokenUtils* @description:* @author: XZY* @create: 2024-03-29 16:01* @Version 1.0**/
@Component
@Slf4j
public class TokenUtils {@Autowiredprivate UserService adminService;public static TokenUtils tokenUtils;@PostConstructpublic void init() {tokenUtils = this;tokenUtils.adminService = this.adminService;}/*** 生成token** @return*/public static String genToken(String adminId, String sign) {return JWT.create().withAudience(adminId) // 将 user id 保存到 token 里面,作为载荷.withAudience("999").withExpiresAt(DateUtil.offsetHour(new Date(), 2)) // 2小时后token过期.sign(Algorithm.HMAC256(sign)); // 以 password 作为 token 的密钥}/*** 获取当前登录的用户信息** @return user对象*  /admin?token=xxxx*/public static User getCurrentAdmin() {String token = null;try {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();// 将RequestAttributes对象设置为子线程共享
//            ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//            RequestContextHolder.setRequestAttributes(sra, true);
//            HttpServletRequest request = sra.getRequest();token = request.getHeader("token");if (StrUtil.isBlank(token)) {token = request.getParameter("token");}if (StrUtil.isBlank(token)) {log.error("获取当前登录的token失败, token: {}", token);return null;}String adminId = JWT.decode(token).getAudience().get(0);User byId = tokenUtils.adminService.getById(Long.valueOf(adminId));return byId;} catch (Exception e) {log.error("获取当前登录的管理员信息失败, token={}", token,  e);return null;}}
}

四.拦截器JwtInterceptor.java


import cn.hutool.core.util.StrUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.example.wenxin.config.BusException;
import com.example.wenxin.entity.User;
import com.example.wenxin.service.UserService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor; /*** @program: wenxin* @ClassName JwtInterceptor* @description:* @create: 2024-03-29 16:27* @Version 1.0**/
@Component
@Slf4j
public class JwtInterceptor implements HandlerInterceptor {private static final String ERROR_CODE_401 = "401";@Autowiredprivate UserService adminService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {String token = request.getHeader("token");if (StrUtil.isBlank(token)) {token = request.getParameter("token");}// 执行认证if (StrUtil.isBlank(token)) {throw new BusException(ERROR_CODE_401, "无token,请重新登录");}// 获取 token 中的adminIdString adminId;User user;try {adminId = JWT.decode(token).getAudience().get(0);// 根据token中的userid查询数据库user = adminService.getById(Long.parseLong(adminId));} catch (Exception e) {String errMsg = "token验证失败,请重新登录";log.error(errMsg + ", token=" + token, e);throw new BusException(ERROR_CODE_401, errMsg);}if (user == null) {throw new BusException(ERROR_CODE_401, "用户不存在,请重新登录");}try {// 用户密码加签验证 tokenJWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassWord())).build();jwtVerifier.verify(token); // 验证token} catch (JWTVerificationException e) {throw new BusException(ERROR_CODE_401, "token验证失败,请重新登录");}return true;}
}

五.拦截器设置

请看第一步第二个方法,设置规则

六.设置自定义头配置


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;/*** @program: wenxin* @ClassName CorsConfig* @description:* @create: 2024-03-29 16:32* @Version 1.0**/
@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置return new CorsFilter(source);}
}

实体类等

/*** @program: wenxin* @ClassName User* @description:* @create: 2024-03-29 16:02* @Version 1.0**/
@Data
public class User {//用户idprivate Long userId;//用户手机号private String userPhone;//用户密码private String passWord;//用户账号private String userName;private String token;
}

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

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

相关文章

2024-3-28

今日流水账&#xff1a; 把计网实验报告完成了&#xff0c;当然还有点小问题就是PC2>PC4的测试截图没有看了下V8中是如何实现快速 for in的&#xff0c;嗯&#xff0c;懵懵懂懂吧&#xff0c;就了解了个 enum cache&#xff0c;其是描述符数组的一个字段&#xff0c;所以其…

计组:指令格式与寻址方式

指令格式 指令格式 一、引言 在计算机科学中&#xff0c;指令格式是计算机指令系统的一个重要组成部分。它规定了计算机指令的编码方式、结构以及各个字段的含义&#xff0c;是计算机硬件和软件之间交互的桥梁。了解指令格式对于理解计算机组成原理、汇编语言编程以及计算机…

YOLOv9改进策略 : C2f改进 | 引入YOLOv8 C2f结构

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;应订阅者需求&#xff0c;如何将YOLOv8 C2f结构引入到YOLOv9 &#x1f4a1;&#x1f4a1;&#x1f4a1;C2f层是一种特殊的卷积层&#xff0c;用于将不同尺度的特征图融合在一起&#xff0c;以提高目标检测的准…

C# 多线程

文章目录 C# 多线程进程与线程无参数的子线程带参数的子线程运行结果 销毁线程 Abort()运行结果 ThreadPool和Task运行结果 C# 多线程 进程与线程 进程&#xff1a;进程就是一个应用程序&#xff0c;对电脑的各种资源的占用 线程&#xff1a;线程是程序执行的最小单位&#…

MySQL锁机制详解及死锁处理方式

前言 为了给高并发情况下的MySQL进行更好的优化&#xff0c;有必要了解一下MySQL查询更新时的锁表机制。 概述 MySQL有三种锁的级别&#xff1a;页级、表级、行级。 MyISAM和MEMORY存储引擎采用的是表级锁&#xff08;table-level locking&#xff09;&#xff1b; BDB存储引…

新型的FPGA器件将支持多样化AI/ML创新进程

作者&#xff1a;郭道正, Achronix半导体中国区总经理 近日举办的GTC大会把人工智能/机器学习&#xff08;AI/ML&#xff09;领域中的算力比拼又带到了一个新的高度&#xff0c;这不只是说明了通用图形处理器&#xff08;GPGPU&#xff09;时代的来临&#xff0c;而是包括GPU、…

Ubuntu服务器搭建 - 环境篇

Ubuntu服务器搭建 - 环境篇 基于腾讯云服务器 - Ubuntu 20.04 LTS 一、安装 - MySQL 1.1 概述 MySQL安装方式有三种: 1. 使用Ubuntu 包管理工具 apt安装 2. 使用MySQL官方APT存储库安装 3. 使用MySQL官方二进制发行版安装 1.2 安装 MySQL 使用MySQL官方APT存储库安装 $ wget…

WSL启动nvidia-docker镜像:报错libnvidia-ml.so.1- file exists- unknown

1.首先使用docker而不是nvidia-docker启动原始镜像下的容器&#xff1a; sudo docker run --rm -it registry.cn-hangzhou.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.1.0-py310-torch2.1.2-tf2.14.0-1.13.1 bash2.在该容器中删除相关nvidia库文件&#xff…

08-研发流程设计(上):如何设计Go项目的开发流程?

在Go 项目开发中&#xff0c;我们不仅要完成产品功能的开发&#xff0c;还要确保整个过程是高效的&#xff0c;代码是高质量的。 所以&#xff0c;Go 项目开发一定要设计一个合理的研发流程&#xff0c;来提高开发效率、减少软件维护成本。研发流程会因为项目、团队和开发模式…

MyBatis的<select>标签可以接收多个参数进行查询

MyBatis的<select>标签可以接收多个参数进行查询 你可以在XML文件中定义多个参数&#xff0c;并在查询语句中使用这些参数进行查询。以下是一个示例&#xff1a; XML查询语句&#xff1a; <select id"selectUsersByAgeAndGender" parameterType"map…

Linux常见内置远程下载工具及检测思路分析

一、Linux常见远程下载工具 Linux中远程下载文件的常用命令有curl、wget和scp。 二、工具详情 1、Curl 1&#xff09;功能&#xff1a; curl命令是一个功能强大的工具&#xff0c;可以用来传输数据&#xff0c;支持多种协议&#xff0c;包括HTTP、HTTPS、FTP等。通过curl命令…

如何利用ChatGPT提升学术论文写作效率

ChatGPT无限次数:点击直达 如何利用ChatGPT提升学术论文写作效率 ChatGPT 是一种基于大规模预训练模型的自然语言处理工具&#xff0c;可以在各种文本生成任务中发挥作用&#xff0c;包括学术论文写作。利用ChatGPT&#xff0c;可以提高学术论文写作的速度和质量&#xff0c;帮…

Kitex 提供的服务注册与发现 etcd 拓展

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 <br> &#x1f4d8;相关专栏<a href"https://blog.csdn.net/studycodeday/category_12460797.html">…

EasyBoss ERP上线实时数据大屏,Shopee本土店铺数据实时监测

近日&#xff0c;灵隐寺PPT汇报用上数据大屏疯狂刷屏&#xff0c;有做东南亚本土电商的老板发现这种数据大屏的模式可以很好地展现店铺运营状况。 所以就有老板来问&#xff1a;EasyBoss能不能也上线实时数据大屏的功能&#xff1f;没问题&#xff01;立马安排&#xff01; 要有…

Coursera自然语言处理专项课程03:Natural Language Processing with Sequence Models笔记 Week01

Natural Language Processing with Sequence Models Course Certificate 本文是https://www.coursera.org/learn/sequence-models-in-nlp 这门课程的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Natural Language Processing with Sequence ModelsWeek 01…

Netty核心原理剖析与RPC实践21-25

Netty核心原理剖析与RPC实践21-25 21 技巧篇&#xff1a;延迟任务处理神器之时间轮 HahedWheelTimer Netty 中有很多场景依赖定时任务实现&#xff0c;比较典型的有客户端连接的超时控制、通信双方连接的心跳检测等场景。在学习 Netty Reactor 线程模型时&#xff0c;我们知道…

基于单片机居家室内环境监测系统仿真设计

**单片机设计介绍&#xff0c;基于单片机居家室内环境监测系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机居家室内环境监测系统仿真设计是一个综合性的项目&#xff0c;它结合了单片机技术、传感器技术、…

【JavaWeb】Day27.Web入门——Tomcat介绍

目录 WEB服务器-Tomcat 一.服务器概述 二.Web服务器 三.Tomcat- 基本使用 1.下载 2.安装与卸载 3.启动与关闭 4.常见问题 四.Tomcat- 入门程序 WEB服务器-Tomcat 一.服务器概述 服务器硬件&#xff1a;指的也是计算机&#xff0c;只不过服务器要比我们日常使用的计算…

xargs后调用bash自定义函数(写该函数文本到脚本, 并引导PATH)

xargs后调用bash自定义函数 需要3步骤,如下 function to_markdown_href_func() { fp$1 #echo $fpecho -e "\n[${fp}](${PREFIX}/${fp})" }BIN/tmp/bin/ F$BIN/to_markdown_href_func.sh mkdir -p $BIN 获得函数to_markdown_href_func的文本 ,写文本到 /tmp/bin/to_ma…

应用案例 | 复合机器人助力智能仓储物流实现高效发展

随着智能仓储物流技术的快速发展&#xff0c;复合机器人作为一种先进的自动化设备&#xff0c;正逐渐在仓储物流领域发挥重要作用。以下是一个复合机器人在智能仓储物流的应用案例。 案例背景 某大型电商企业面临着日益增长的订单量和仓储物流压力。为了提高物流效率、降低人力…