在项目中引入JWT令牌

一.什么是JWT?

JWT:全称JSON Web Token(JSON网络令牌)。通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。

二.JWT有什么作用?

JWT最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求之前,都要先进行JWT安全校验,通过之后再进行处理。

比喻:把系统比喻一家公司,我登录系统以后,就会给我发一个出入证,在进入公司的每个部门、每个房间之前,都要初始这个出入证,才能进入公司。这样使得公司安全性就比较高。

三.JWT的组成

JWT由3部分组成,之间用.拼接

如下图所示:

1.Header

我们将上面的JSON对象,通过Base64加密后,就成了1中的红线字符串。

2.Payload(载荷,存放有效信息的地方)

我们将上面的JSON对象,通过Base64加密后,就成了1中的黄线字符串。

3.Signature(签名,就是对前两部分再次加密)

先将前两部分的结果,用.拼接

然后将拼接结果再次加密,得到1中的绿线字符串

四.JWT的基本使用

1.引入依赖

jdk1.8只用加下面这一个依赖

XML 复制代码
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

jdk1.8以后的依赖,还需加下面几个依赖

XML 复制代码
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

2.编写测试方法

java 复制代码
public class Test01 {

    //设置有效时间为1天
    private long time = 1000*60*60*24;
    //设置签名信息
    private String signature = "admin";

    //创建JWT(Json Web Token)
    @Test
    public void jwt(){
        //1.创建jwtBuilder,用于后续构建JWT(JSON WEB TOKEN)
        JwtBuilder jwtBuilder = Jwts.builder();
        //2.构建JWT
        String jwtToken = jwtBuilder
                //header
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
                //payload
                .claim("username","tom")
                .claim("role","admin")
                .setSubject("admin-test")
                .setExpiration(new Date(System.currentTimeMillis()+time))
                .setId(UUID.randomUUID().toString())
                //signature
                .signWith(SignatureAlgorithm.HS256, signature)
                //将三者拼接成字符串即可
                .compact();
        //输出生成的JWT
        System.out.println(jwtToken);
    }
    
    //解析jwt
    @Test
    public void parse(){
        String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE3NDc4NzYxNjUsImp0aSI6IjI0M2I3YmViLWZiNjAtNDJiZS1iYTgzLWRmNjJhMWQ2Y2FiZCJ9.-DLbbhSfedUp8_dIbAXvqGi_ItBSYnfO5jQgS_WDbhs";
        JwtParser jwtParser = Jwts.parser();
        //通过我们的自定义签名,对生成的token进行解析
        Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        //获取jwt中的信息
        System.out.println(claims.get("username"));
        System.out.println(claims.get("role"));
        System.out.println(claims.getId());
        System.out.println(claims.getSubject());
        System.out.println(claims.getExpiration());
        
    }
}

3.运行结果

上图jwt()测试方法运行结果如下:这就是由三部分组成的JWT令牌(出入证)。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE3NDc4NzY3MTgsImp0aSI6IjQ4MjY1ODVkLTMwYTMtNDBjYS1iYjNkLTExZWU3NTU1ZjkyNyJ9.4LhB5EPjEbR8pJ1j1t2bFFHbHWBk_SNatkr9oiWICtM

上图parse()测试方法运行结果如下:这就是解析上面的jwt后,得到的信息。

tom

admin

4826585d-30a3-40ca-bb3d-11ee7555f927

admin-test

Thu May 22 09:18:38 CST 2025

五.项目中JWT的使用

1.大致流程(两个功能)

①第一次登陆时,如果登陆成功,后端就返回token给前端保存起来

②前端后续的每次请求,都会携带token到后端进行认证,如果认证通过,才会允许前端进行后续操作

相关推荐
_阿伟_1 小时前
JWT介绍
安全
zhengfei6112 小时前
小白级手册——全面剖析红队信息收集思考
网络·安全·web安全
qq_452396233 小时前
第十三篇:《K8s 安全基础:RBAC、ServiceAccount、Pod Security》
java·安全·kubernetes
TechWayfarer4 小时前
苏超赛事网站安全防护:WAF、DDoS与仿冒页面如何联动治理
网络·python·安全·flask·ddos
持敬chijing4 小时前
Web渗透之SQL注入-常用sql语句
sql·安全·web安全·网络安全
顾凌陵4 小时前
Web安全二阶段综合测试:知识点速查与实战技巧
安全·web安全
小羽网安5 小时前
2026年服务器安全防护实战:从被DDoS到完整防护体系搭建
服务器·安全·ddos
DolitD5 小时前
点盾云新增VR加密功能:一机一码,让VR内容分发安全可控
安全·vr·视频
marsh02065 小时前
62 openclaw金融级应用开发:安全与性能的双重挑战
安全·青少年编程·ai·金融
志栋智能6 小时前
超自动化安全的技术选型与架构设计指南
运维·安全·自动化