后端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.hqwc.cn/news/562576.html

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

相关文章

OceanMind海睿思入选中国信通院《2023高质量数字化转型技术解决方案集》

近日&#xff0c;由中国信息通信研究院“铸基计划”编制的《2023高质量数字化转型技术解决方案集&#xff08;第一版&#xff09;》正式发布。 中新赛克海睿思 凭借卓越的产品力以及广泛的行业实践&#xff0c;成功入选该方案集的数据分析行业技术解决方案。 为促进数字化转型…

大模型学习笔记七:LLM应用

文章目录 一、维护生产级别的LLM应用,需要做的事二、符合需求的LLM App维护平台三、LangFuse1)替换OpenAI客户端(把跟OpenAI交互记录到LangFuse)1.1)几个基本概念2)通过LangChain的回调函数触发记录(上面用的原生OpenAI接口,下面是调用LangChain的接口)3)构建一个实际…

蓝桥刷题--N皇后和最近公共祖先

1.N皇后 #include<iostream> using namespace std;const int N 12; int vis[N][N], n, ans;void dfs(int dep) {// 在这个搜索中dep表示行&#xff0c;i表示列// 1 搜索出口if(dep n 1){ans;return;}// 2 继续搜索for(int i 1; i < n; i){// 2.1 排除非法情况if(v…

副业赚钱秘籍:让空闲时间更有价值

副业&#xff0c;无疑是增加收入、实现财务自由的理想途径&#xff0c;尤其适合那些希望利用闲暇时间创造价值的人群。今天&#xff0c;我为您精选了六种副业赚钱策略&#xff0c;让您轻松拓宽财源。 一、网络营销&#xff1a;通过社交媒体、博客或在线市场&#xff0c;巧妙推…

Linux进程管理:(九)实时调度

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 实时指的是一个特定任务的执行时间必…

分布式商业模式是企业提升新质生产力、重塑生产关系的关键(附分布式商业模式设计六要素)

本文内容摘自思二勋所著的《分布式商业生态战略》一书。 如今&#xff0c;数字化转型如火如荼&#xff0c;数字化给予很多企业和个人网络化、生态化、协同化发展机会。一种基于网络的分布式商业模式或将为企业高效率、低成本开展工作提供新的路径。 数字化技术的成熟带来了万…

火鹰论文工具推荐 #职场发展#知识分享

《火鹰论文工具推荐》 在当今学术界和科研领域&#xff0c;写作是不可或缺的一环。为了保证自己的论文质量&#xff0c;我们经常需要借助一些工具来帮助我们提高效率和质量。其中一款非常好用、靠谱、方便、能用的工具就是火鹰论文。 火鹰论文是一款专业的论文写作工具&#x…

【java数据结构】基于java提供的ArrayList实现的扑克牌游戏-(附源码~)

【Java数据结构】基于java泛型实现的二维数组完成三人扑克游戏 基本框架的实现创建一副牌如何进行洗牌&#xff1a;每个人抓的牌放到哪里&#xff1a; 源码具体实现cardcardsTest 个人简介&#xff1a;努力学编程 每日鸡汤&#xff1a;stay foolish,stay hungry-史蒂芬.乔布斯斯…

深入探索C语言动态内存分配:释放你的程序潜力

&#x1f308;大家好&#xff01;我是Kevin&#xff0c;蠢蠢大一幼崽&#xff0c;很高兴你们可以来阅读我的博客&#xff01; &#x1f31f;我热衷于分享&#x1f58a;学习经验&#xff0c;&#x1f3eb;多彩生活&#xff0c;精彩足球赛事⚽ &#x1f31f;感谢大家的支持&#…

JetBrains数据库驱动下载失败解决方法

本方法可通用于解决PyCharm等JetBrains家的IDE下载数据库驱动问题。 在Jet家IDE内连接数据库时&#xff0c;mysql、sqlite等的驱动有部分在 https://download.jetbrains.com 网站上&#xff0c;可能由于网络问题无法访问。 解决方法是修改 JetBrains 路径下的 jdbc.drivers.xm…

波奇学Linux:网络套接字

domain:ipv4 还是ipv6 type:面向字节流还是... 虚拟机 云服务器禁止直接bind公网ip 服务器可以有多个ip&#xff0c;如果只绑定一个ip&#xff0c;只能收到来自一个ip的信息 任意地址绑定 关于port的问题 [0,1024]&#xff1a;系统内定的端口号&#xff0c;一般要用固定的应…

eth 交易案例分析9

交易hash: 先用0.26eth买入了多个GPT&#xff0c;然后用这多个GPT 在uniswap3 兑换了1.69 个eth&#xff0c; 疑问点&#xff1a;买入的 DLP 什么意思&#xff1f;