JWT的使用

目录

1.介绍

1.1为什么会有Jwt出现?

1.2什么是Jwt?

2.使用Jwt

2.1导入依赖

2.2创建Jwt方法

2.3解析jwt方法

2.4判断Jwt是否正确

2.5测试

2.6完整使用步骤


1.介绍

1.1为什么会有Jwt出现?

在聊Jwt之前,我们先聊聊不使用前后端分离使用spring业务开发,页面资源都在resource目录下。那么在做登录的时候,我们往往会将用户信息存入session当中,进入页面之前判断是否有session,有就放行,没有就让你登录。但是如果spring前后端分离了,那么就不能存session,并且cookie和session要禁用,为什么?因为Spring mvc跨域配置中,默认是不允许携带cookie与头信息 ,sessionID又是保存在cookie里面,cookie都拿不到,那session就不用多说。关键还是跨域问题,浏览器默认对跨域请求的 Cookie 设置有限制SameSite 策略可能会阻止跨域发送 Cookie。但是使用 Token(如 JWT)可以通过 HTTP 标头(如 Authorization)传递,不受跨域限制,从而代替session与cookie

1.2什么是Jwt?

jwt可以理解为是一个将身份信息加密后生成很长的字符串,加密算法可以自由选择。并且可以设置过期时间。常用于身份验证和信息交换场景,通常由三部分组成,Header(头部),Payload有效(载荷),Signature(签名)。他的工作原理就是后端生成jwt,前端接收到后存入本地比如浏览器的local storage,后续每次请求都会将信息放在请求头中,后端通过请求头取出来解析判断jwt是否正确,并做出相对于的策略

2.使用Jwt

2.1导入依赖

复制代码
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.12.5</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.12.5</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.12.5</version>
        </dependency>

2.2创建Jwt方法

其实如果真正想用,只需要.claims(加密的内容),.signWith(加密的算法),builder.expiration()设置过期时间。其余的都是规范问题,核心就是设置这三个就可以用。

java 复制代码
/**
     * 创建token
     * @param payload 数据载体
     * @param ttl 过期时间
     * @return JWT
     */
    public static String createToken(Map<String, Object> payload, long ttl) {
        JwtBuilder builder = Jwts.builder()
                //采用HS256加密算法对JWT进行签名
                .signWith(Jwts.SIG.HS256.key()
                        .random(new SecureRandom(SECRET.getBytes()))
                        .build())
                //JWT的唯一标识
                .id(UUID.randomUUID().toString())
                //设置载体内容
                .claims(payload)
                //设置签发人
                .issuer("org.xxx")
                //主题
                .subject("JWT_AUTH")
                //JWT颁发时间
                .issuedAt(new Date());
        //设置过期时间
        if(ttl >= 0) {
            builder.expiration(getExpDate(ttl));
        }
        //创建JWT
        return builder.compact();
    }
​
    /**
     * 计算过期时间
     * @param ttl
     * @return
     */
    private static Date getExpDate(long ttl) {
        Date expDate = new Date(System.currentTimeMillis() + ttl);
        System.out.println("Token过期时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(expDate));
        return expDate;
    }

2.3解析jwt方法

怎么加密,那就怎么解析。算法必须一致。

java 复制代码
/**
     * 解析token,获取载体数据
     * @param token JWT
     * @param type 载体数据的类型
     * @return
     * @param <T>
     */
    public static <T> T parseToken(String token, String name, Class<T> type) {
        return Jwts.parser()
                .verifyWith(Jwts.SIG.HS256.key()
                        .random(new SecureRandom(SECRET.getBytes()))
                        .build())
                .build()
                .parseSignedClaims(token)
                .getPayload()
                .get(name, type);
    }

2.4判断Jwt是否正确

java 复制代码
 /**
     * 校验token
     * @param token
     */
    public static void verify(String token) {
        Jwts.parser()
                .verifyWith(Jwts.SIG.HS256.key()
                        .random(new SecureRandom(SECRET.getBytes()))
                        .build())
                .build()
                .parseSignedClaims(token);
    }

2.5测试

java 复制代码
public static void main(String[] args) {
        Map<String, Object> payload = new HashMap<>();
        payload.put("name", "user1");
        System.out.println(JwtUtils.createToken(payload, 1000 * 60 * 60 * 24));
    }

2.6完整使用步骤

1.登录成功在service层调用createToken方法,完成生成给vo一并返回给前端。

2.前端通过请求回调获取jwt,并保存在local storage中。

3.每次请求都从local storage取出jwt,放在请求头中发给后端。

4.后端就可以通过拦截器获取请求头的信息,为了全文使用,后端可以将请求信息存入到session作用域中。

相关推荐
海棠一号12 分钟前
JAVA理论第五章-JVM
java·开发语言·jvm
eternal__day29 分钟前
Spring Cloud 多机部署与负载均衡实战详解
java·spring boot·后端·spring cloud·负载均衡
颜淡慕潇33 分钟前
Redis 实现分布式锁:深入剖析与最佳实践(含Java实现)
java·redis·分布式
哆啦A梦的口袋呀35 分钟前
基于Python学习《Head First设计模式》第七章 适配器和外观模式
python·学习·设计模式
笑鸿的学习笔记36 分钟前
虚幻引擎5-Unreal Engine笔记之SET节点的输出引脚获取设置后的最新变量值
笔记·ue5·虚幻
恰薯条的屑海鸥38 分钟前
零基础在实践中学习网络安全-皮卡丘靶场(第十期-Over Permission 模块)
学习·安全·web安全·渗透测试·网络安全学习
程序员秘密基地39 分钟前
基于vscode,idea,java,html,css,vue,echart,maven,springboot,mysql数据库,在线考试系统
java·vue.js·spring boot·spring·web app
何中应40 分钟前
【设计模式-5】设计模式的总结
java·后端·设计模式
草莓熊Lotso41 分钟前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
吾日三省吾码1 小时前
Spring 团队详解:AOT 缓存实践、JSpecify 空指针安全与支持策略升级
java·spring·缓存