后端Jwt实现Token编码、解码以及axios的request请求头的Token传输方式

目录

一、什么是JWT:

二、Jwt的使用:

第一步:引入依赖:

第二步:配置拦截器:JwtInterceptor.java:

其中异常文件ServiceException配置如下:

全局异常文件GlobalException.java文件配置如下:

其中所需的Result配置如下:

第三步:配置拦截设置文件:InterceptorConfig.java:

第四步:配置Token工具类文件:TokenUtils.java:

request.js的axios封装文件为:

文件布局大致如下:


一、什么是JWT:

        JWT是token的一种实现方式,全称是:JSON Wwb Token。简单来讲,Jwt是一种字符串,可以根据用户信息进行相关的编码操作生成带有用户信息的JWT token,我们可以根据这个来判断其信息是否正确或者是否被篡改。

二、Jwt的使用:

首先是后端:

第一步:引入依赖:

		<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.3.0</version></dependency>

第二步:配置拦截器:JwtInterceptor.java:

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.cqcrhouduan.Utils.TokenUtils;
import com.example.cqcrhouduan.exception.ServiceException;
import com.example.cqcrhouduan.mapper.UserMapper;
import io.micrometer.common.util.StringUtils;
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;@Component
@Slf4j
public class JwtInterceptor implements HandlerInterceptor {@Autowiredprivate UserMapper userMapper;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {if(request.getMethod().equals("OPTIONS")){return true;}String token = request.getHeader("token");if (StringUtils.isEmpty(token)) {token = request.getParameter("token");}token = token;// 执行认证if (StringUtils.isEmpty(token)) {throw new ServiceException(401, "无token,请重新登录");}// 获取 token 中的adminIdString userId;User user;try {userId = JWT.decode(token).getAudience().get(0);  //解码// 根据token中的userid查询数据库user = userMapper.getById(Integer.parseInt(userId));user = user;} catch (Exception e) {String errMsg = "token验证失败,请重新登录";log.error(errMsg + ", token=" + token, e);throw new ServiceException(401, errMsg);}if (user == null) {throw new ServiceException(401, "用户不存在,请重新登录");}try {// 用户密码加签验证 tokenJWTVerifier jwtVerifier =             JWT.require(Algorithm.HMAC256(user.getPassword())).build();jwtVerifier.verify(token); // 验证token} catch (JWTVerificationException e) {throw new ServiceException(401, "token验证失败,请重新登录");}return true;}
}
其中异常文件ServiceException配置如下:
import com.example.cqcrhouduan.pojo.Result;
import lombok.Data;@Data
public class ServiceException extends RuntimeException {private int code;public ServiceException(String msg){super(msg);this.code = 500;}public ServiceException(int code, String msg){super(msg);this.code = code;}
}
全局异常文件GlobalException.java文件配置如下:
import com.example.cqcrhouduan.pojo.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;//自定义异常
@ControllerAdvice
public class GlobalException {@ExceptionHandler(ServiceException.class)@ResponseBodypublic Result serviceException(ServiceException e){return Result.error(e.getCode(),e.getMessage());}
}
其中所需的Result配置如下:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {private Integer code;private String msg;private Object data;public static Result success(Object data){return new Result(200,"success",data);}public static Result success(){return new Result(200,"success",null);}public static Result error(String msg){return new Result(500,msg,null);}public static Result error(Integer Code ,String msg){return new Result(Code,msg,null);}}

第三步:配置拦截设置文件:InterceptorConfig.java:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {// 加自定义拦截器JwtInterceptor,设置拦截规则@Overrideprotected void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor()).addPathPatterns("/**").excludePathPatterns("/login","/register");super.addInterceptors(registry);}@Beanpublic JwtInterceptor jwtInterceptor(){return new JwtInterceptor();}
}

第四步:配置Token工具类文件:TokenUtils.java:

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.example.cqcrhouduan.mapper.UserMapper;
import com.example.cqcrhouduan.pojo.User;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;@Component
@Slf4j
public class TokenUtils {private static UserMapper staticAdminService;@Resourceprivate UserMapper adminService;@PostConstructpublic void setUserService() {staticAdminService = adminService;}/*** 生成token** @return*/public static String genToken(int adminId, String sign) {return JWT.create().withAudience(Integer.toString(adminId)) // 将 user id 保存到 token 里面,作为载荷.withExpiresAt(DateUtil.offsetHours(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();token = request.getHeader("token");if (StringUtils.isNotBlank(token)) {token = request.getParameter("token");}if (StringUtils.isBlank(token)) {log.error("获取当前登录的token失败, token: {}", token);return null;}String userId = JWT.decode(token).getAudience().get(0);return staticAdminService.getById(Integer.valueOf(userId));} catch (Exception e) {log.error("获取当前登录的管理员信息失败, token={}", token,  e);return null;}}
}
然后是前端axios配置:

request.js的axios封装文件为:

import axios from "axios";
import router from "../modules/router.js";const request = axios.create({baseURL:'http://localhost:8080/',  //自己的请求地址timeout:30000,
})// Add a request interceptor
request.interceptors.request.use((config) => {config.headers['Content-Type'] = 'application/json;charset=utf-8';let user = JSON.parse(localStorage.getItem("userToken") || '{}')// console.log(user.token)  //查看tokenconfig.headers['token'] = user.token// config.headers.Authorization = localStorage.getItem("userToken")console.log("ok")// Do something before request is sentreturn config;
}, error => {console.log('request error' + error)// Do something with request errorreturn Promise.reject(error);
});// Add a response interceptor
request.interceptors.response.use(response => {let res = response.data;if (typeof res === 'string'){res = res ? JSON.parse(res) : res}// if(res.code === 401){ //自动跳转//     router.push('/')// }// Any status code that lie within the range of 2xx cause this function to trigger// Do something with response datareturn res;
}, function (error) {// Any status codes that falls outside the range of 2xx cause this function to trigger// Do something with response errorconsole.log('response error' + error)return Promise.reject(error);
});export default request

文件布局大致如下:

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

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

相关文章

利用Base64加密算法将数据加密解密

1. Base64加密算法 Base64准确来说并不像是一种加密算法&#xff0c;而更像是一种编码标准。 我们知道现在最为流行的编码标准就是ASCLL&#xff0c;它用八个二进制位&#xff08;一个char的大小&#xff09;表示了127个字符&#xff0c;任何二进制序列都可以用这127个字符表…

hbuilderX打包vue项目白屏问题以及element-ui的icon图标无法正常显示问题

附录一&#xff1a;hbuilderX打包vue项目白屏问题 将项目目录下的config文件夹里的index.js文件中,将build对象下的assetsPublicPath中的“/”&#xff0c;改为“./”后&#xff0c;再打包生成的 dist 文件 build: { // assetsPublicPath: /,//修改前 assetsPublicPa…

逻辑 | 逻辑先修营

学习到更新日期逻辑先修营-3常见逻辑连词及逻辑表达2024-3-23 1.形式逻辑基础1 2.形式逻辑基础2 3.常见逻辑连词及逻辑表述 4.OR相关考点 5.AND相关考点 6.逻辑箭头基本考点1 7.逻辑箭头基本考点2 8.代入逻辑推理事实真1 9.代入逻辑推理事实真2 10.形式逻辑四大基本考点…

C语言-指针问题-排序问题

题目描述 输入 10 个整数&#xff0c;将他们从小到大排序后输出&#xff0c;并给出每个元素在原来序列中的位置. 将程序需要的代码补全&#xff0c;只提交 begin 到 end 部分的代码。 #include <stdio.h> #define N 10int main() {int a[N], b[N], cnt 1, i, j, tmp;…

【Entity Framework】 EF中DbContext类详解

【Entity Framework】 EF中DbContext类详解 一、概述 DbContext类是实体框架的重要组成部分。它是应用域或实例类与数据库交互的桥梁。 从上图可以看出DbContext是负责与数据交互作为对象的主要类。DbContext负责以下活动&#xff1a; EntitySet&#xff1a;DbContext包含…

Web前端—事件循环

事件循环 事件循环浏览器的进程模型何为进程&#xff1f;何为线程&#xff1f;浏览器有哪些进程和线程&#xff1f; 渲染主线程是如何工作的&#xff1f;若干解释何为异步&#xff1f;面试题&#xff1a;如何理解JS的异步&#xff1f;JS会阻碍渲染任务有优先级吗&#xff1f;面…

宜搭低代码高级认证实操题2 faas连接器加密解密

密钥维护页-保证有一条数据 敏感信息提交页 存档页&#xff0c;只是用来存数据的审批的时候不用这个表提交数据不然会出两条 授权查看页 FaaS连接器先下载好他的示例代码然后按照要求配置好参数直接拷贝进去就行 然后需要在云开发环境里面先new一个terminal然后跑一下./builde…

Leetcode - 周赛389

目录 一&#xff0c;3083. 字符串及其反转中是否存在同一子字符串 二&#xff0c;3084. 统计以给定字符开头和结尾的子字符串总数 三&#xff0c;3085. 成为 K 特殊字符串需要删除的最少字符数 四&#xff0c;3086. 拾起 K 个 1 需要的最少行动次数 一&#xff0c;3083. 字符…

3月23日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 首个国产单池万卡液冷算力集群投入运营&#xff0c;满足万亿级大模型训练需求 &#x1f30d; 快手电商正式启动兴农计划 &#x1f30b; 360AI浏览器APP即将上线&#xff0c;支持500万字长文本处理 &#x1f381; 安卓 1…

如何在没有备份的情况下恢复 Android 上已删除的照片?

丢失 Android 设备上的珍贵照片可能是一场噩梦&#xff0c;尤其是在没有备份的情况下。无论是意外删除图像还是由于Android 崩溃而丢失图像&#xff0c;一想到它们可能会永远消失就令人沮丧。幸运的是&#xff0c;有多种方法可以在 Android 上恢复已删除的照片。 如何在没有备份…

一文打尽分布式系统中的事务处理!

之前分享了分布式事务的实现方案&#xff0c;今天我们来对比总结一下&#xff1a; 如何使用最大努力通知实现分布式事务&#xff1f;与本地消息表区别&#xff1f; 如何通过本地消息表实现分布式事务 用二阶段三阶段提交实现分布式事务 如何用TCC实现分布式事务&#xff1f…

上海晋名室外危化品暂存柜助力医药制造行业安全

近日上海晋名又有两台室外危化品暂存柜项目通过验收&#xff0c;此次项目主要用于医药制造行业次氯酸钠、乙醇消毒剂、甲醛等化学品的室外暂存安全。 用户单位创立于2003年&#xff0c;是一家以从事医药制造业为主的企业。用户在日常工作运营中涉及到次氯酸钠、乙醇消毒剂、甲…

面试算法-76-最接近的三数之和

题目 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], target 1 输出&#…

MT2191 整数大小比较(高精度)

给出两个正整数&#xff0c;判断他们的大小。 输入格式&#xff1a; 两个正整数。 输出格式&#xff1a; 若前者大&#xff0c;输出>&#xff1b; 若后者大&#xff0c;输出<&#xff1b; 若一样大&#xff0c;输出。 输入&#xff1a; 1412894619244619891 23762842…

蓝桥杯2021年第十三届省赛真题-纪念日

一、题目 纪念日 2020 年 7 月 1 日是中国共产党成立 99 周年纪念日。中国共产党成立于 1921 年 7 月 23 日。请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包 含多少分钟&#xff1f;填空题 二、分析 法一&#xff1a; 借助计算机算出有多少天&am…

Matlab|基于条件风险价值CVaR的微网动态定价与调度策略

目录 1 主要内容 模型示意图 电能交易流程 模型亮点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序复现文章《A cooperative Stackelberg game based energy management considering price discrimination and risk assessment》&#xff0c;建立基于主从博弈的考虑…

继承和深拷贝封装

继承和深拷贝封装 今日目标&#xff1a; 1.es5寄生组合式继承 2.es6类的继承 3.深拷贝函数封装 00-回顾 # 不同数据类型赋值时的区别&#xff1a; 基本数据类型&#xff0c;赋的就是值&#xff0c;相互之间不再有任何影响 引用数据类型&#xff0c;赋的是地址&#xff0c…

LeetCode 每日一题 2024/3/18-2024/3/24

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/18 303. 区域和检索 - 数组不可变3/19 1793. 好子数组的最大分数3/20 1969. 数组元素的最小非零乘积3/21 2671. 频率跟踪器3/22 2617. 网格图中最少访问的格子数3/23 254…

OpenJudge - 02:找第一个只出现一次的字符

总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个只包含小写字母的字符串&#xff0c;请你找到第一个仅出现一次的字符。如果没有&#xff0c;输出no。 输入 一个字符串&#xff0c;长度小于100000。 输出 输出第一个仅出现一次的字符&#xff0c;若没有则输出no。 样例输…

LeetCode-热题100:22. 括号生成

题目描述 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a; n 3 输出&#xff1a; [“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2&#xff1a;…