JWT(令牌)、Filter(过滤器)和interceptor(拦截器) -----(JWT)

52 阅读3分钟

串联契机:登录校验 在服务器端接收到浏览器发送过来的请求之后,首先我们要对请求进行校验,通过校验的允许后续的业务操作,访问后续的数据, 而未通过校验的则会被提示错误. 常用相关技术有JWT(令牌)、Filter(过滤器)和interceptor(拦截器)三种.

JWT令牌

JWT是什么呢?

JWT全称(JSON Web Token),JWT基于令牌技术,令牌就是用户身份的标识,其本质就是一个字符串

JWT主要做到了什么呢?

可以根据自身的需求在jwt令牌中存储自定义的数据内容,而且jwt将原始的json数据格式进行了安全的封装(基于Base64编码对字符串进行加密),这样就可以直接基于jwt使在通信双方安全的情况下进行信息传输了。

JWT包含什么?(组成)

JWT的组成: (JWT令牌由三个部分组成,三个部分之间使用英文的点来分割)

  • 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}
  • 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}
  • 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。
  • 相关字段:自定义签名/定时 定时允许JWT的Token存活时间

在Spring中的使用:

依赖:

<dependency> 
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId> 
        <version>0.9.1</version> 
</dependency>

传值:

//对象值
Map<String, Object> claims = new HashMap<>();

加密

public static String generateJwt(Map<String,Object> claims){
    String jwt = Jwts.builder()
            .addClaims(claims)
            .signWith(SignatureAlgorithm.HS256, signKey)
            .setExpiration(new Date(System.currentTimeMillis() + expire))
            .compact();
    return jwt;
}

解析

/**
 * 解析JWT令牌
 * @param jwt JWT令牌
 * @return JWT第二部分负载 payload 中存储的内容
 */
public static Claims parseJWT(String jwt){
    Claims claims = Jwts.parser()
            .setSigningKey(signKey)
            .parseClaimsJws(jwt)
            .getBody();
    return claims;
}

验证修改(修改一点字符就不能破解)

image.png

JWTUTil工具类

package com.itheima.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.Map;

public class JwtUtils {

    private static String signKey = "SVRIRUlNQQ==";
    private static Long expire = 43200000L;

    /**
     * 生成JWT令牌
     * @return
     */
    public static String generateJwt(Map<String,Object> claims){
        String jwt = Jwts.builder()
                .addClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    /**
     * 解析JWT令牌
     * @param jwt JWT令牌
     * @return JWT第二部分负载 payload 中存储的内容
     */
    public static Claims parseJWT(String jwt){
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}

JWT被携带验证过程: 后端发送请求携带令牌(token),通过后,每次在访问时都会携带token去访问前端.

JWT令牌存储在浏览器的本地存储空间 localstorage中了。 localstorage 是浏览器的本地存储,在移动端也是支持的。