1.首先理解jwt是什么

jwt:全称(JSON Web Token),是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。是目前最流行的跨域身份验证解决方案。

2.jwt的结构是什么样的

jwt由三部分组成,它们之间用圆点(.)连接。这三部分分别是
1.  Header
2.  Payload
3.  Signature例如:aaa.bbb.zzz
具体说明如下:Header:由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)。
例如:{“alg”:”HS256”,“typ”:“JWT”
}然后,用Base64对这个JSON编码就得到JWT的第一部分Payload :是JWT的第二部分,是关于实体(通常是用户)和其他数据的声明例如:{“name”:“username”,“age”:18
}
对payload进行Base64编码就得到JWT的第二部分
注意:不要在JWT的payload或header中放置敏感信息,除非它们是加密的。
Signature:签名部分,你必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可,
例如:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
说明:Signature用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方是否为它所称的发送方。

3. JWT与Session的差异

   相同点:都是存储用户信息;然而,Session是在服务器端的,而JWT是在客户端的。不同点:Session方式存储用户信息的最大问题在于要占用大量服务器内存,增加服务器的开销JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力

4.Token授权是如何工作的

  流程:1.用于通过用户名和密码登陆2.服务器校验用户名和密码3.服务器端提供一个token给客户端4.客户端存储token,并在之后的请求中通过header部分携带传入服务器端5.服务器端校验客户端传入的token是否有效6.校验通过访问相应的资源
注意:如果是应用请求来自不同的域,当前应用请设置允许跨域。

JJWT(Java JWT):适用于 Java 和 Android 的 JSON Web Token(JWT)库

1.在Springboot项目中引入相关依赖如下:

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

2.相关类和接口

public class CommonConstants {public static final String JWT_KEY_USER_ID = "userId";public static final String JWT_KEY_NAME = "name";
}public class StringHelper {public static String getObjectValue(Object obj){return obj==null?"":obj.toString();}
}public interface IJWTInfo {/*** 获取用户名* @return*/String getUniqueName();/*** 获取用户ID* @return*/String getId();/*** 获取名称* @return*/String getName();
}

3.JWT具体操作类

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.joda.time.DateTime;public class JWTHelper {private static RsaKeyHelper rsaKeyHelper = new RsaKeyHelper();/*** 密钥加密token** @param jwtInfo* @param priKeyPath* @param expire* @return* @throws Exception*/public static String generateToken(IJWTInfo jwtInfo, String priKeyPath, int expire) throws Exception {String compactJws = Jwts.builder().setSubject(jwtInfo.getUniqueName()).claim(CommonConstants.JWT_KEY_USER_ID, jwtInfo.getId()).claim(CommonConstants.JWT_KEY_NAME, jwtInfo.getName()).setExpiration(DateTime.now().plusSeconds(expire).toDate()).signWith(SignatureAlgorithm.RS256, rsaKeyHelper.getPrivateKey(priKeyPath)).compact();return compactJws;}/*** 密钥加密token** @param jwtInfo* @param priKey* @param expire* @return* @throws Exception*/public static String generateToken(IJWTInfo jwtInfo, byte priKey[], int expire) throws Exception {String compactJws = Jwts.builder().setSubject(jwtInfo.getUniqueName()).claim(CommonConstants.JWT_KEY_USER_ID, jwtInfo.getId()).claim(CommonConstants.JWT_KEY_NAME, jwtInfo.getName()).setExpiration(DateTime.now().plusSeconds(expire).toDate()).signWith(SignatureAlgorithm.RS256, rsaKeyHelper.getPrivateKey(priKey)).compact();return compactJws;}/*** 公钥解析token** @param token* @return* @throws Exception*/public static Jws<Claims> parserToken(String token, String pubKeyPath) throws Exception {Jws<Claims> claimsJws = Jwts.parser().setSigningKey(rsaKeyHelper.getPublicKey(pubKeyPath)).parseClaimsJws(token);return claimsJws;}/*** 公钥解析token** @param token* @return* @throws Exception*/public static Jws<Claims> parserToken(String token, byte[] pubKey) throws Exception {Jws<Claims> claimsJws = Jwts.parser().setSigningKey(rsaKeyHelper.getPublicKey(pubKey)).parseClaimsJws(token);return claimsJws;}/*** 获取token中的用户信息** @param token* @param pubKeyPath* @return* @throws Exception*/public static IJWTInfo getUserInfoFromToken(String token, String pubKeyPath) throws Exception {Jws<Claims> claimsJws = parserToken(token, pubKeyPath);Claims body = claimsJws.getBody();return new JWTInfo(body.getSubject(), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_USER_ID)), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_NAME)));}/*** 获取token中的用户信息** @param token* @param pubKey* @return* @throws Exception*/public static IJWTInfo getUserInfoFromToken(String token, byte[] pubKey) throws Exception {Jws<Claims> claimsJws = parserToken(token, pubKey);Claims body = claimsJws.getBody();return new JWTInfo(body.getSubject(), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_USER_ID)), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_NAME)));}
}

SpringBoot 通过jjwt快速实现token授权相关推荐

  1. SpringBoot快速实现微信授权登录

    文章目录 1.引入weixin-java-mp 2.配置文件配置公众号信息 3.加载配置信息 3.1加载配置属性 3.2初始化配置 3.3Controller实现 4.设置微信公众平台 5.前台请求及 ...

  2. 【spring authorization server系列教程】(一)入门系列,spring authorization server简介。快速构建一个授权服务器(基于最新版本0.3.0)

    系列文章目录 [spring authorization server系列教程](一)入门系列,快速构建一个授权服务器 文章目录 系列文章目录 前言 一.目前已实现的功能 二.入门,一步一步快速开始构 ...

  3. springboot中JJWT的简单使用

    springboot中JJWT的简单使用 一 什么是JWT jwt全称json web token,是基于json协议的用于结局认证授权的方法.token就是令牌,其主要作用是用来进行授权(Autho ...

  4. SpringBoot系列: RestTemplate 快速入门

    ==================================== 相关的文章 ==================================== SpringBoot系列: 与Sprin ...

  5. JeecgBoot 2.1 Online表单版本发布,基于SpringBoot+AntDesign的快速开发平台

    项目介绍 Jeecg-Boot 是一款基于SpringBoot+代码生成器的快速开发平台!采用前后端分离架构:SpringBoot,Ant-Design-Vue,Mybatis,Shiro,JWT.强 ...

  6. 《SpringBoot揭秘:快速构建微服务体系》—第2章2.4节本章小结*

    本节书摘来自华章出版社<SpringBoot揭秘:快速构建微服务体系>一书中的第2章,第2.4节本章小结*,作者王福强,更多章节内容可以访问云栖社区"华章计算机"公众号 ...

  7. 《SpringBoot揭秘:快速构建微服务体系》—第3章3.5节本章小结

    本节书摘来自华章出版社<SpringBoot揭秘:快速构建微服务体系>一书中的第3章,第3.5节本章小结,作者王福强,更多章节内容可以访问云栖社区"华章计算机"公众号查 ...

  8. bootstrap table 分页_Java入门007~springboot+freemarker+bootstrap快速实现分页功能

    本节是建立在上节的基础上,上一节给大家讲了管理后台表格如何展示数据,但是当我们的数据比较多的时候我们就需要做分页处理了.这一节给大家讲解如何实现表格数据的分页显示. 准备工作 1,项目要引入freem ...

  9. idea新建springboot后端到前端_基于SpringBoot+AntDesign的快速开发平台

    项目介绍 Jeecg-Boot是一款基于SpringBoot+代码生成器的快速开发平台!前后端分离架构.技术采用SpringBoot.AntDesignVue.Mybatis.Shiro.JWT.强大 ...

最新文章

  1. 不要一辈子靠技术生存
  2. php接口数据安全解决方案(一)
  3. dwz ajax session超时跳转登录页(struts2自定义拦截器)
  4. 第13天学习Java的笔记(类定义)
  5. linux 查询替换文件内容吗,Linux 下查询文件的方法 替换文件内容
  6. Lowest Common Multiple Plus ——ACM
  7. C语言 指针声明和定义 - C语言零基础入门教程
  8. Tomcat log文件
  9. 【python基础知识】调用C++接口(setup.py运行)出现的各种问题
  10. ANSI C:+++
  11. Maven学习总结(21)——Maven常用的几个核心概念
  12. 需要显卡还是cpu_装机应该在哪个硬件上省钱, CPU还是显卡, 看完本文就知道了...
  13. string类有可以调换方向的函数吗_关于String类的split()方法
  14. php安全拦截,php类中的各种拦截器用法分析
  15. 深入浅出 — 数据分析
  16. QWidget_层级关系
  17. WordPress企业主题:企业一号
  18. Mac 安装 Icarus-Verilog 报错解决方案参考
  19. 图文详解双向链表原理
  20. iOS 15 导航栏(Navigation)变白(导航栏不见)

热门文章

  1. 关于属性和字段的初步了解
  2. Imagination宣布和恩智浦(NXP)达成最新授权协议
  3. 超牛指标------飞狐公式源码
  4. Android 开机动画制作过程?
  5. 2019 IDEA 导出war包和部署
  6. 用原生js实现map方法
  7. Android 证书安装流程分析
  8. MySQL STRAIGHT_JOIN
  9. 超级不爽,居然被人开怼:估计你一辈子就是个程序员
  10. python构造函数调用成员函数_成员函数中的Python调用构造函数