SpringBoot集成JWT实现token验证以及代码演示

article/2025/6/19 10:24:49

一、JWT的主要应用场景

身份认证在这种场景下,一旦用户完成了登陆,在接下来的每个请求中包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。由于它的开销非常小,可以轻松的在不同域名的系统中传递,所有目前在单点登录(SSO)中比较广泛的使用了该技术。 信息交换在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。

优点

1.简洁(Compact): 可以通过URLPOST参数或者在HTTP header发送,因为数据量小,传输速度也很快
2.自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库
3.因为Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持。
4.不需要在服务端保存会话信息,特别适用于分布式微服务。

`

二、JWT的结构

JWT是由三段信息构成的,将这三段信息文本用.连接一起就构成了JWT字符串。
就像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

JWT包含了三部分:
Header 头部(标题包含了令牌的元数据,并且包含签名和/或加密算法的类型)
Payload 负载 (类似于飞机上承载的物品)
Signature 签名/签证

Header

JWT的头部承载两部分信息:token类型和采用的加密算法。

 

{ "alg": "HS256","typ": "JWT"
} 

声明类型:这里是jwt
声明加密的算法:通常直接使用 HMAC SHA256

加密算法是单向函数散列算法,常见的有MD5、SHA、HAMC。
MD5(message-digest algorithm 5) (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值
SHA (Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,安全性高于MD5
HMAC (Hash Message Authentication Code),散列消息鉴别码,基于密钥的Hash算法的认证协议。用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。常用于接口签名验证

Payload

载荷就是存放有效信息的地方。
有效信息包含三个部分
1.标准中注册的声明
2.公共的声明
3.私有的声明

标准中注册的声明 (建议但不强制使用) :

iss: jwt签发者
sub: 面向的用户(jwt所面向的用户)
aud: 接收jwt的一方
exp: 过期时间戳(jwt的过期时间,这个过期时间必须要大于签发时间)
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

公共的声明 :

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

私有的声明 :

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

Signature

jwt的第三部分是一个签证信息
这个部分需要base64加密后的headerbase64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
密钥secret是保存在服务端的,服务端会根据这个密钥进行生成token和进行验证,所以需要保护好。

三、下面来进行SpringBoot和JWT的集成

(1)application.yml

server:port: 7009
spring:application:name: ware-jwt-token
config:jwt:# 加密密钥secret: iwqjhda8232bjgh432[cicada-smile]# token有效时长expire: 3600# header 名称header: token

(2)通用工具类 JwtConfig 

@ConfigurationProperties(prefix = "config.jwt")
@Component
public class JwtConfig {/** 根据身份ID标识,生成Token*/public String getToken (String identityId){Date nowDate = new Date();//过期时间Date expireDate = new Date(nowDate.getTime() + expire * 1000);return Jwts.builder().setHeaderParam("typ", "JWT").setSubject(identityId).setIssuedAt(nowDate).setExpiration(expireDate).signWith(SignatureAlgorithm.HS512, secret).compact();}/** 获取 Token 中注册信息*/public Claims getTokenClaim (String token) {try {return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();}catch (Exception e){e.printStackTrace();return null;}}/** Token 是否过期验证*/public boolean isTokenExpired (Date expirationTime) {return expirationTime.before(new Date());}private String secret;private long expire;private String header;public String getSecret() {return secret;}public void setSecret(String secret) {this.secret = secret;}public long getExpire() {return expire;}public void setExpire(long expire) {this.expire = expire;}public String getHeader() {return header;}public void setHeader(String header) {this.header = header;}
}

(3)通用工具类 WebConfig 拦截器注册


@Configuration
public class WebConfig implements WebMvcConfigurer {/*** 拦截器注册*/@Resourceprivate TokenInterceptor tokenInterceptor ;public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(tokenInterceptor).addPathPatterns("/**");}
}
/*** Token 拦截器*/
@Component
public class TokenInterceptor extends HandlerInterceptorAdapter {@Resourceprivate JwtConfig jwtConfig ;@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {// 地址过滤String uri = request.getRequestURI() ;if (uri.contains("/login")){return true ;}// Token 验证String token = request.getHeader(jwtConfig.getHeader());if(StringUtils.isEmpty(token)){token = request.getParameter(jwtConfig.getHeader());}if(StringUtils.isEmpty(token)){throw new Exception(jwtConfig.getHeader()+ "不能为空");}Claims claims = jwtConfig.getTokenClaim(token);if(claims == null || jwtConfig.isTokenExpired(claims.getExpiration())){throw new Exception(jwtConfig.getHeader() + "失效,请重新登录");}//设置 identityId 用户身份IDrequest.setAttribute("identityId", claims.getSubject());return true;}
}

(4)写一个Controller来测试

@RestController
public class TokenController {@Resourceprivate JwtConfig jwtConfig ;/** 返参格式* {*     "userName": "ID123",*     "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.*               eyJzdWIiOiJJRDEyM3B3MTIzIiwiaWF0Ijox.*               SqqaZfG_g2OMijyN5eG0bPmkIQaqMRFlUvny"* }*/// 拦截器直接放行,返回Token@PostMapping("/login")public Map<String,String> login (@RequestParam("userName") String userName,@RequestParam("passWord") String passWord){Map<String,String> result = new HashMap<>() ;// 省略数据源校验String token = jwtConfig.getToken(userName+passWord) ;if (!StringUtils.isEmpty(token)) {result.put("token",token) ;}result.put("userName",userName) ;return result ;}// 需要 Token 验证的接口@PostMapping("/info")public String info (){return "info" ;}
}

(5)运行结果 注册了token .

(5)运行结果 没携带请求头Headers

(5)运行结果 携带请求头Headers


http://chatgpt.dhexx.cn/article/La7s6Fef.shtml

相关文章

2018.8.2课堂笔记

一.用户配置文件与密码配置文件 1.1 /etc/passwd是由 “ &#xff1a;” 分割7个字段&#xff0c;每个字段的含义如下&#xff1a; [rootlocalhost ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/no…

python爬虫反虫之setcookie

作者原文传送littleywww.littley.top 反爬表现 在使用python或rust进行爬虫的时候的有时会遇到请求返回一段含有只含有js代码的html页面如图&#xff1a; 分析及优化文件 首先解决转义字符\x63\x73\x4b&#xff0c;转义字符可以通过console.log()打印出来&#xff0c;最方…

java 数据抓取 动态获得cookies里变动的属性_Java爬取CSDN博客遇到setCookie问题

最近有一个需求就是爬取CSDN上的数据&#xff0c;但是目前遇到了一个问题就是关于获取CSDN的cookie的问题。到目前为止并没有什么好的办法。希望大家可以给我留言&#xff0c;我们一起探讨。。 在我没有设置cookie的时候&#xff0c;会报以下错误。 function setCookie(name,va…

js的cookie操作

cookie.js: //这个cookie的js代码借用的老外的&#xff0c;我加了中文注释--原文:http: //www.echoecho.com/jscookies02.htm ///设置cookie function setCookie(NameOfCookie, value, expiredays) { //参数:三个变量用来设置新的cookie: //cookie的名称,存储的Cookie值, …

蓝牙 宽带通话 (wide band speech)WBS 剖析(一) -- profile层

一.概述 WBS&#xff08;wide band speech&#xff09;通俗来讲就是蓝牙宽带通话&#xff0c;通话数据frequency 16K&#xff0c;采用msbc编解码&#xff08;chip中实现&#xff09; 和NBS&#xff08;narrow band speech&#xff09;相对&#xff0c;NBS通俗来讲是窄带通话&a…

通话参数配置的经验和技巧

整体的通话信号流程如下&#xff1a; MIC采集信号 -> 放大器 -> ADC采集 -> 通话MIC数字增益 -> AEC算法 -> ANS降噪算法 -> 通话MIC后端数字增益 -> 通话EQ -> 蓝牙上行。 配置中如图所示&#xff1a; MIC去直流fliter配置&#xff1a;MIC高通flite…

CHOLAN:一种模块化实体链接方法

CHOLAN: A Modular Approach for Neural Entity Linking on Wikipedia and Wikidata 论文链接&#xff1a;https://arxiv.org/abs/2101.09969 (EACL 2021) 代码实现&#xff1a;https://github.com/ManojPrabhakar/CHOLAN ABSTRACT 本文作者提出了实现在知识库上进行端到端…

高清语音技术(WBS)及其在手机和蓝牙耳机中的实现

高清语音也被称为宽带语音&#xff0c;是一种能为蜂窝网络、移动电话和无线耳机传输高清、自然语音质量的音频技术。与传统的窄带电话相比&#xff0c;高清语音很大程度上提高了语音质量&#xff0c;减少了听觉负担。 通信产业链上的所有网络和设备都需支持高清语音才能体现出该…

蓝牙编码格式Codec的优先级配置

【Bluetooth】Android版本所支持的蓝牙协议code查询 Android版本所支持的蓝牙协议code查询方法&#xff1a; 协议配置文件有2个&#xff0c;一个是谷歌源生的&#xff0c;一个是高通自己添加的。 优先级&#xff1a;高通 > 谷歌。对于同一种协议会进行覆盖。 其中&#xff…

基于Android Q的蓝牙通话无声问题

分享一下这几天改蓝牙通话无声的bug&#xff0c;文章有点长&#xff0c;希望各位看官看完能帮助到大家—今天分析的主题是蓝牙通话没有声音之运行流程分析 一. 结果说在前面 ​ 蓝牙通话分别有七个阶段&#xff0c;基本上每个阶段都会走到底层&#xff0c;把数据回调到上层&a…

BQB pts测试

测试BQB的pts dongle是在蓝牙SIG官网买的,链接是 https://store.bluetooth.com/12210888/orders/d3b63cfd9d3d5a22c2e08ad9711a91c4 pts dongle最新的测试结果 ACS-BV-07-I/ACS-BV-12-I/ACS-BI-13-I 这三个是接完电话就fail ICA-BV-02-I/TCA-BV-01-I 这两个是挂不了电话 ICR-B…

蓝牙btsnoop log,HFP协议连接流程详解,以及RFCOMM连接和常用AT指令

HFP&#xff08;Hands-Free&#xff09;&#xff1a;蓝牙免提协议,两个角色AG&#xff0c;HF端&#xff0c;AG端通常是手机设备&#xff0c;HF免提端一般为耳机车载等&#xff0c;hfp的连接首先要进行SDP&#xff0c;然后建立RFCOMM&#xff0c;然后SLC连接完成&#xff0c;HFP…

蓝牙协议HFP(Hands-Free Profile)电话免提协议 Connection management 连接管理HFP SLC 的建立跟释放

零. 概述 本文章主要讲下电话免提协议HFP&#xff08;Hands-Free Profile&#xff09;Connection management。包括connection establishment 跟connection realease&#xff0c;那connection establishment又会涉及到HFP SLC的建立过程。 本节讲解的内容就是一下HFP fea…

蓝牙A2DP和HFP编解码

一、A2DP A2DP全名是&#xff08;Advanced Audio Distribution Profile&#xff09; 蓝牙音频传输模型协定&#xff0c;提供通过蓝牙连接传输音频流的能力&#xff0c;比如手机播放音乐&#xff0c;蓝牙耳机通过蓝牙连接听歌。 mp3和flac音频编码都是在PCM音频编码基础上二次编…

Rockchip安卓11.0 16k wbs msbc HFP PCM语音通话支持

Rockchip安卓11.0 16k wbs/msbc HFP PCM语音通话支持 调试平台: 安卓11.0, rk3328, 博通ap6212芯片, HFP 8K已经调通的情况下. SDK修改支持16k wbs/msbc HFP PCM语音注意点如下: 1. bluedroid(system/bt) 博通方案中, ESCO_DATA_PATH_PCM 为1代表蓝牙芯片作为pcm master, 6…