SpringBoot JWT
admin
2024-03-02 14:39:57
0

JWT是一种鉴权机制,实现前后端分离登陆和权限的一种解决方式,用户在登陆之后后端生成token传到前端,以后每次的请求都携带着token到后端验证,如果过期或者失效就要求重新登陆。
具体详情请看:https://blog.csdn.net/weixin_53312997/article/details/126938201

后端如何实现token

首先导个依赖

        com.auth0java-jwt3.4.0com.alibabafastjson1.2.78

其次建立一个jwt工具类

import com.alibaba.fastjson.JSON;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;import java.util.Base64;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;/*** create by fzg* 2021/10/12 9:41*/public class JwtUtil {private static String TOKEN = "token!Q@W3e4r";/*** 生成token * @param map //传入payload * @return 返回token */public static String getToken(Map map){JWTCreator.Builder builder = JWT.create();map.forEach((k,v)->{ builder.withClaim(k,v); });Calendar instance = Calendar.getInstance();instance.add(Calendar.HOUR,24*3);builder.withExpiresAt(instance.getTime());return builder.sign(Algorithm.HMAC256(TOKEN)).toString();}/**7.整合springboot * 验证token * @param token * @return* @return*/public static void verify(String token){JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);}/*** 获取token中payload * @param token * @return */public static DecodedJWT getToken(String token){return JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);}// token 获取idpublic static Integer getTokenId(String token){DecodedJWT untoken = JwtUtil.getToken(token);String payload = untoken.getPayload();Base64.Decoder decoder = Base64.getDecoder();byte[] bytes = decoder.decode(payload);//System.out.println("BASE64解密:" + new String(bytes));String str = new String(bytes);HashMap hashMap = JSON.parseObject(str, HashMap.class);Integer aid = Integer.parseInt(hashMap.get("aid").toString());return aid;}// 解密tokenpublic static String getClaim(String token, String key) {DecodedJWT decodedJWT = JWT.decode(token);Claim value = decodedJWT.getClaim(key);return value.asString();}
}

请求拦截器

import com.auth0.jwt.exceptions.AlgorithmMismatchException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fzg.common.tool.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;/*** create by fzg* 2021/10/12 10:47*/public class MyInterceptor implements HandlerInterceptor {@Autowiredprivate JwtUtil jwtUtil;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 从前端请求中获取tokenString token = request.getHeader("token");Map map = new HashMap<>();if (token == null){map.put("state",false);map.put("msg","token为空");}else {try {JwtUtil.verify(token);Integer aid = Integer.parseInt(JwtUtil.getClaim(token,"aid"));request.setAttribute("aid",aid);return true;}catch (TokenExpiredException e){map.put("state",false);map.put("msg","token已过期!");}catch (SignatureVerificationException e){map.put("state",false);map.put("msg","签名错误!");}catch (AlgorithmMismatchException e){map.put("state",false);map.put("msg","加密算法不匹配");}catch (Exception e){map.put("state",false);map.put("msg","无效token!");}}String json = new ObjectMapper().writeValueAsString(map);response.setContentType("application/json;charset=UTF-8");response.getWriter().println(json);return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

拦截配置

拦截所有请求,除了用户登陆和注册,其他都需要经过MyInterceptor请求拦截器

import com.fzg.common.interceptor.MyInterceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** create by fzg* 2021/10/12 12:02*/@Component
public class InceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/register").excludePathPatterns("/user/login");}
}

跨域配置

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;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** create by fzg* 2021/10/9 10:57*/@Configuration
public class CrosConfig implements WebMvcConfigurer {@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedOrigin("*");config.addAllowedMethod("*");config.addAllowedHeader("*");config.addExposedHeader("token");UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();configSource.registerCorsConfiguration("/**", config);return new CorsFilter(configSource);}
}

用户登陆成功后后端将token传到前端

HashMap map = new HashMap<>();
map.put("aid",user.getAid().toString());
String token = JwtUtil.getToken(map);

前端的所有请求携带token

//引入axios,进行二次封装
import axios from 'axios'const requests = axios.create({// 配置对象//基础路径,发送请求的时候,路径当中会出现apibaseURL: 'http://localhost:8001',// baseURL: 'http://43.142.195.65:8001',//代表请求超时的时间5秒timeout: 5000,
});export default requests;
// 前端拿到之后存储到localStorage,
// 发送请求的时候再携带token
export const requestMethodName = (param) => requests({url: `/blog/userCancelCollectBlog?blogAid=${param}`,method: 'post',headers: {token: localStorage.getItem('token'),}
});// get请求(例子)
export const queryUserConcernList = (data) => requests({url: `/user/queryUserConcernList`,method: 'get',params: data,headers: {token: localStorage.getItem('token'),}
});// post请求例子
export const sendMessageToChatObject = (params) => requests({url: `/chat/sendMessageToChatObject`,method: 'post',data: params,headers: {token: localStorage.getItem('token'),}
});

相关内容

热门资讯

描写雨的片段 描写雨的片段雨,春天的淡蓝色的雨啊千万条银丝,荡漾在半空中,迷迷漫漫的轻纱,披上了黑油油的田野。雨落...
我们家孩子一年级拼音总是不会,... 我们家孩子一年级拼音总是不会,急请专家帮忙有专门的那种拼音的有声挂图,一按就可以出声,还可以做练习,...
金丝楠木黑色的阴沉木埋在地下距... 金丝楠木黑色的阴沉木埋在地下距今有多少年千,万年的都有六千年以下为阴沉木,六到九千年为乌木。根据你的...
我是一名中专生,刚出来实习,工... 我是一名中专生,刚出来实习,工程造价专业,目前这个专业的工作很难找,找不到自己专业的,很迷茫,请问我...
平阴历史与名人 平阴历史与名人平阴,春秋为鲁地,战国属齐邑,秦代属济北郡。汉属泰山郡。三国属魏兖州剌史部。两晋属济北...
寻欧美真人演绎童话故事 寻欧美真人演绎童话故事小飞侠Peter Pan 真人版 爱丽丝梦游仙境阁楼里的外星人
郭采洁的个人资料? 郭采洁的个人资料?如题郭采洁个人资料 中文名:郭采洁 高中前的名字:郭彦君,高中后改名:郭采洁 英文...
想要戴手镯,但是手太大戴不进去... 想要戴手镯,但是手太大戴不进去,有什么方法可以戴进去?手上可以涂护手霜啊、打肥皂啊、精油等等,可以润...
宫2里面哪一集有杨幂 宫2里面哪一集有杨幂第一集,开头的时候,几分钟 在最后结束的时候,客串了一下花影第一集,她和冯绍峰演...
我儿子是你儿子的爸爸,我是你的... 我儿子是你儿子的爸爸,我是你的谁?我是你的公公
斗Ο仙八荒星盘怎么用? 斗Ο仙八荒星盘怎么用?在斗Ο仙里八荒星盘是可以定位的,最多可以定十个位置,然后再次使用的话会选择位置...
求电影名称:一个作家,经常听到... 求电影名称:一个作家,经常听到鸟叫声,去做肿瘤手术,他的大脑里有一只眼睛。好像是暗度天日我看没看全,...
一个很暧昧的男生给你说他以前的... 一个很暧昧的男生给你说他以前的女朋友的事,算什么?我觉得你很有机会~如果他不肯踏出那一步,那你就自己...
2012款丰田皇冠选择哪个颜色... 2012款丰田皇冠选择哪个颜色的内饰好看购车时无论是车身颜色的选择,还是内饰颜色的选择都能体现出您独...
wepokeai机器人!wep... wepokeai机器人!wepoke是不是有挂(透明挂)原来真的有挂(有挂神器)1、上手简单,内置详...
德扑ai助手!德扑ai智能(辅... 德扑ai助手!德扑ai智能(辅助)其实真的有挂(有挂攻略)1、让任何用户在无需德扑ai助手AI插件第...
德扑ai智能!德扑之星能看到底... 德扑ai智能!德扑之星能看到底牌吗(透明挂)其实真的有挂(有挂下载)是一款可以让一直输的玩家,快速成...
求人物好看剧情也好的动漫 求人物好看剧情也好的动漫SA特优生不错的,爱情类的,集数不多
德扑之星有猫腻!德扑之星禁止模... 德扑之星有猫腻!德扑之星禁止模拟器(辅助)原来真的有挂(有挂总结)1、金币登录送、破产送、升级送、活...