什么是JWT

1. 什么是JWT

JWT本质是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。

2.JWT的认证流程如下:

  1. 首先,前端通过Web表单将自己的用户名和密码发送到后端的接口,这个过程一般是一个POST请求。建议的方式是通过SSL加密的传输(HTTPS),从而避免敏感信息被嗅探
  2. 后端核对用户名和密码成功后,将包含用户信息的数据作为JWT的Payload,将其与JWT Header分别进行Base64编码拼接后签名,形成一个JWT Token,形成的JWT Token就是一个如同lll.zzz.xxx的字符串
  3. 后端将JWT Token字符串作为登录成功的结果返回给前端。前端可以将返回的结果保存在浏览器中,退出登录时删除保存的JWT Token即可
  4. 前端在每次请求时将JWT Token放入HTTP请求头中的Authorization属性中(解决XSS和XSRF问题)

后端检查前端传过来的JWT Token,验证其有效性,比如检查签名是否正确、是否过期、token的接收方是否是自己等等
6.
验证通过后,后端解析出JWT Token中包含的用户信息,进行其他逻辑操作(一般是根据用户信息得到权限等),返回结果

在这里插入图片描述

3.JWT优势

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.Demo

4.1导入依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
 
注意:JDK版本1.8以上 要导入下面的依赖
<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>

4.2 编写测试用例

package com.itheima;

import io.jsonwebtoken.*;
import org.junit.jupiter.api.Test;

import java.util.Date;
import java.util.HashMap;

public class JWTTest {
    @Test
    public void generateJwtTest(){
        //1.定义数据
        HashMap hashMap = new HashMap();
        hashMap.put("userId", String.valueOf(12345));
        hashMap.put("phone", String.valueOf(1311111212));

        long now = System.currentTimeMillis();

        //2.创建jwt
        String token = Jwts.builder()
                //1.header 加密算法 2.playload 3.自定义字符串
                .signWith(SignatureAlgorithm.HS256, "renxu")
                .setClaims(hashMap)
                .setExpiration(new Date(now + 500000))
                .compact();
        System.out.println(token);
    }

    @Test
    public void paraseJwtTest(){
        String token ="eyJhbGciOiJIUzI1NiJ9.eyJwaG9uZSI6IjEzMTExMTEyMTIiLCJleHAiOjE2NTg4ODgyMDAsInVzZXJJZCI6IjEyMzQ1In0.5i6tr0DjJ8Fq00S9KopZCiRfE5ca3sxp-MngTCO3s4M";

        try {
            Claims claims = Jwts.parser()
                    .setSigningKey("renxu")
                    .parseClaimsJws(token)
                    .getBody();

            String userId = (String) claims.get("userId");
            String phone = (String) claims.get("phone");
            System.out.println(userId);
            System.out.println(phone);
        } catch (ExpiredJwtException e) {
            System.out.println("token失效");
        } catch (SignatureException e){
            System.out.println("token有误");
        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值