Spring Boot 整合 JWT

1、JWT 是什么?

JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名。

简单来说,就是通过一定规范来生成 token,然后可以通过解密算法逆向解密 token,这样就可以获取用户信息。

优点:

1)生产的 token 可以包含基本信息,比如 id、用户昵称、头像等信息,避免再次查库

2)存储在客户端,不占用服务端的内存资源

缺点:

token 是经过 base64 编码,所以可以解码,因此 token 加密前的对象不应该包含敏感信息,如用户权限,密码等

2、JWT 格式组成:头部、负载、签名

header+payload+signature

头部:主要是描述签名算法

负载:主要描述是加密对象的信息,如用户的id等,也可以加些规范里面的东西,如 iss 签发者,exp 过期时间,sub 面向的用户

签名:主要是把前面两部分进行加密,防止别人拿到 token 进行 base 解密后篡改 token

3、关于jwt客户端存储

可以存储在 Cookie,localStorage 和 sessionStorage 里面

4、引入相关依赖并开发 JWT 工具类

1)引入依赖

1<!-- JWT相关 --> 2<dependency> 3 <groupId>io.jsonwebtoken</groupId> 4 <artifactId>jjwt</artifactId> 5 <version>0.7.0</version> 6</dependency>

2)开发生产 token 方法

3)开发检验 token 方法

1package com.haitaiinc.clinicpathservice.utils; 2 3import com.haitaiinc.clinicpathservice.entity.UserInfo; 4import io.jsonwebtoken.Claims; 5import io.jsonwebtoken.Jwts; 6import io.jsonwebtoken.SignatureAlgorithm; 7import org.springframework.util.StringUtils; 8 9import java.util.Date; 10 11public class JwtUtils { 12 public static final String SUBJECT = "admin"; 13 14 /** 15 * 过期时间,毫秒,一周 16 */ 17 public static final long EXPIRE = 1000 * 60 * 60 * 24 * 7; 18 19 /** 20 * 秘钥 21 */ 22 public static final String APPSECRET = "haitaiinc"; 23 24 /** 25 * 生成jwt 26 * 27 * @param userInfo 28 * @return 29 */ 30 public static String geneJsonWebToken(UserInfo userInfo) { 31 32 if (userInfo == null || StringUtils.isEmpty(userInfo.getUserId()) || StringUtils.isEmpty(userInfo.getUserName())) { 33 return null; 34 } 35 String token = Jwts.builder().setSubject(SUBJECT) 36 .claim("id", userInfo.getUserId()) 37 .claim("name", userInfo.getUserName()) 38 .setIssuedAt(new Date()) 39 .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) 40 .signWith(SignatureAlgorithm.HS256, APPSECRET).compact(); 41 42 return token; 43 } 44 45 46 /** 47 * 校验token 48 * 49 * @param token 50 * @return 51 */ 52 public static Claims checkJWT(String token) { 53 54 try { 55 final Claims claims = Jwts.parser().setSigningKey(APPSECRET). 56 parseClaimsJws(token).getBody(); 57 return claims; 58 59 } catch (Exception e) { 60 } 61 return null; 62 } 63}

4)测试

1package com.haitaiinc.clinicpathservice; 2 3import com.haitaiinc.clinicpathservice.entity.UserInfo; 4import com.haitaiinc.clinicpathservice.utils.JwtUtils; 5import io.jsonwebtoken.Claims; 6import org.junit.jupiter.api.Test; 7 8public class CommonTest { 9 10 @Test 11 public void testGeneJwt() { 12 UserInfo user = new UserInfo(); 13 user.setUserId("admin"); 14 user.setUserName("管理员"); 15 16 String token = JwtUtils.geneJsonWebToken(user); 17 System.out.println(token); 18 19 } 20 21 22 @Test 23 public void testCheck() { 24 String token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlkIjoiYWRtaW4iLCJuYW1lIjoi566h55CG5ZGYIiwiaWF0IjoxNTc3NTU3MDU1LCJleHAiOjE1NzgxNjE4NTV9.VrrKtCTnxVN76JhpyIusCGq9Wj89wLor0OqIJ6s0zXo"; 25 Claims claims = JwtUtils.checkJWT(token); 26 if (claims != null) { 27 String id = (String) claims.get("id"); 28 String name = (String) claims.get("name"); 29 System.out.println(id); 30 System.out.println(name); 31 } else { 32 System.out.println("非法token"); 33 } 34 } 35}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用