Shiro实战详解(4)--JWT生成token以及解析token

JWT生成token以及解析token

    • 06 Springboot+Shiro+Jwt前后端分离鉴权
      • 1、前后端分离会话问题
        • 【1】问题追踪
        • 【2】解决方案
      • 2、JWT概述
          • 1.Header
          • 2.payload
          • 3.Signature
      • JWT生成Token及解析

06 Springboot+Shiro+Jwt前后端分离鉴权

1、前后端分离会话问题

【1】问题追踪

前面我们实现分布式的会话缓存,但是我们发现此功能的实现是基于浏览的cookie机制,也就是说

用户禁用cookie后,我们的系统会就会产生会话不同的问题

【2】解决方案

我们的前端可能是web、Android、ios等应用,同时我们每一个接口都提供了无状态的应答方式,

这里我们提供了基于JWT的token生成方案

2、JWT概述

​ JWT(JSON WEB TOKEN):JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个

紧凑的自包含的方式在不同实体之间安全传输信息(JSON格式)。它是在Web环境下两个实体之间传

输数据的一项标准。实际上传输的就是一个字符串。

实现步骤:

1.创建RedisSessionDao extends AbstractSessionDAO

2.配置ShiroConfig首先Shiro是一套安全认证框架,已经有了对token的相关封装。而JWT只是一种生

成token的机制,需要我们自己编写相关的生成逻辑。

​ 最后 Shiro是基于session保持会话 的,也就是说是有状态的。而JWT则是无状态的(服务端不保存

session,而是生成token发送给客户端进行保存,之后的所有的请求都需要携带token,再对token进

行解析判断)。

​ 虽然Shiro也有相关的token(比如UsernamePasswordToken类),但是只是Shiro在服务端对用

户信息进行判断的方式而已,并不是JWT所生成的可发送给客户端的字符串token。也就是说Shiro的

token并不能响应给客户端。

  • 广义上:JWT是一个标准的名称;
  • 狭义上:JWT指的就是用来传递的那个token字符串

JWT由三部分构成:header(头部)、payload(载荷)和signature(签名)。

1.Header

存储两个变量

  • 秘钥(可以用来比对)
  • 算法(也就是下面将Header和payload加密成Signature)
2.payload

存储很多东西,基础信息有如下几个

  • 签发人,也就是这个“令牌”归属于哪个用户。一般是 userId
  • 创建时间,也就是这个令牌是什么时候创建的
  • 失效时间,也就是这个令牌什么时候失效(session的失效时间)
  • 唯一标识,一般可以使用算法生成一个唯一标识(jti==>sessionId)
3.Signature

这个是上面两个经过Header中的算法加密生成的,用于比对信息,防止篡改Header和payload

然后将这三个部分的信息经过加密生成一个 JwtToken 的字符串,发送给客户端,客户端保存在本地。

​ 当客户端发起请求的时候携带这个到服务端(可以是在 cookie ,可以是在 header ),在服务端进行

验证,我们需要解密对于的payload的内容

JWT生成Token及解析

1.pom文件导入依赖

<!--引入JWT依赖-->
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.4.0</version>
</dependency>

2.设置JWT工具类

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;import java.util.*;/*** @author jx* @version 1.0* @since 2024/1/22**/
public class JWTUtil {//盐private static final String SIGN = "java";private static final String JWT_KEY_PHONE = "phone";private static final String JWT_KEY_IDCARD = "idCard";//生成tokenpublic static String createToken(String phone,String idCard){Map<String,String> map = new HashMap<>();map.put(JWT_KEY_PHONE,phone);map.put(JWT_KEY_IDCARD,idCard);//token过期时间Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DATE,1);Date date = calendar.getTime();JWTCreator.Builder builder = JWT.create();//整合mapmap.forEach((k,v) -> {builder.withClaim(k,v);});//整合过期时间builder.withExpiresAt(date);//生成tokenString token = builder.sign(Algorithm.HMAC256(SIGN));return token;}//解析tokenpublic static Map<String, String> parseToken(String token){DecodedJWT verify = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);String phone = verify.getClaim(JWT_KEY_PHONE).toString();String identity = verify.getClaim(JWT_KEY_IDCARD).toString();Map<String, String> map = new HashMap<>();map.put("phone",phone);map.put("idCard",identity);return map;}public static void main(String[] args) {String token = createToken("15101230564","123456789");System.out.println("生成的token:"+token);Map<String, String> mapResult = parseToken(token);System.out.println("phone:"+mapResult.get("phone"));System.out.println("idCard:"+mapResult.get("idCard"));}}

3.结果

生成的token:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwaG9uZSI6IjE1MTAxMjMwNTY0IiwiaWRDYXJkIjoiMTIzNDU2Nzg5IiwiZXhwIjoxNzA1OTkyNTI5fQ.CjJ5HuAv-sLCNjmIEWbwRuxff4VX7cRIL25A07hwwO4
phone:"15101230564"
idCard:"123456789"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux驱动】休眠与唤醒 | POLL机制 | 异步通知 | 阻塞与非阻塞 | 软件定时器

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux驱动》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3d3;休眠与唤醒&#x1f3f8;内核函数&#x1f3f8;驱动框架及编程 &#x1f3d3;…

代码随想录算法训练DAY25|回溯2

算法训练DAY25|回溯2 216.组合总和III 力扣题目链接 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数&#xff0c;并且每种组合中不存在重复的数字。 说明&#xff1a; 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n …

本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程语…

Linux操作系统——理解软硬链接

1.引言 通过我们前面理解文件系统的基础上&#xff0c;我们来理解软硬链接&#xff0c;在我们学习文件的时候我们会见到各种链接文件&#xff0c;其中链接文件分为两种&#xff0c;一种叫软连接&#xff0c;一种叫硬链接。 下面我们新建一个log文件&#xff0c;要对log这个文…

【SpringCloud Alibaba】 介绍及微服务模块搭建

文章目录 SpringCloud Alibaba 介绍主要功能组件 微服务环境搭建案例准备技术选型模块设计微服务调用 创建父工程创建基础模块1、创建 shop-common 模块2、创建实体类 创建用户微服务1、创建pom.xml2、编写主类3、创建配置文件 创建商品微服务1、创建一个名为 shop-product 的模…

理解PCIE设备透传

PCIE设备透传解决的是使虚拟机直接访问PCIE设备的技术&#xff0c;通常情况下&#xff0c;为了使虚拟机能够访问Hypervisor上的资源&#xff0c;QEMU&#xff0c;KVMTOOL等虚拟机工具提供了"trap and emulate"&#xff0c; Virtio半虚拟化等机制实现。但是这些实现都…

leetcode 151反转字符串如何原地去除多余空格

题目&#xff1a;https://leetcode.cn/problems/reverse-words-in-a-string/description/ 完整题解:https://leetcode.cn/problems/reverse-words-in-a-string/solutions/2611893/chu-li-kong-ge-ku-han-shu-reversefan-zhu-bioo 思路来自代码随想录&#xff0c;对其中的除去多…

websocket实现聊天室(vue2 + node)

通过websocket实现简单的聊天室功能 需求分析如图&#xff1a; 搭建的项目结构如图&#xff1a; 前端步骤&#xff1a; vue create socket_demo (创建项目)views下面建立Home , Login组件路由里面配置路径Home组件内部开启websocket连接 前端相关组件代码&#xff1a; Login…

【操作系统】实验二 Proc文件系统

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Docker基础使用

Docker基础使用 1.查看容器挂载文件夹一定要放开权限&#xff0c;否则后面启动nexus时会无法启动1.查询远程镜像重启docker服务容器自启动关闭容器自启动查看docker容器是否挂载容器挂载解释保存和加载本地镜像创建mysql容器容器转换为镜像创建dockerfile容器相互通讯查看容器的…

使用Rancher管理Kubernetes集群

部署前规划 整个部署包括2个部分&#xff0c;一是管理集群部署&#xff0c;二是k8s集群部署。管理集群功能主要提供web界面方式管理k8s集群。正常情况&#xff0c;管理集群3个节点即可&#xff0c;k8s集群至少3个。本文以3节点管理集群&#xff0c;3节点k8s集群为例 说明部署过…

vivado JTAG链、连接、IP关联规则

JTAG链 这列出了定义板上可用的不同JTAG链。每个链都列在下面<jtag_chain>以及链的名称&#xff0c;以及定义名称和链中组件的位置&#xff1a; <jtag_chains> <jtag_chain name"chain1"> <position name"0" component"part0…

ELK 分离式日志(1)

目录 一.ELK组件 ElasticSearch&#xff1a; Kiabana&#xff1a; Logstash&#xff1a; 可以添加的其它组件&#xff1a; ELK 的工作原理&#xff1a; 二.部署ELK 节点都设置Java环境: 每台都可以部署 Elasticsearch 软件&#xff1a; 修改elasticsearch主配置文件&…

计算机视觉工程师就业前景如何?

计算机视觉作为一门快速发展的技术领域&#xff0c;其就业前景非常广阔。以下是对计算机视觉就业前景的分析&#xff1a; 市场规模&#xff1a;计算机视觉行业的市场规模正在持续扩大。根据行业分析报告&#xff0c;预计全球计算机视觉市场规模将在2025年达到530亿美元&#xf…

【Web实操10】定位实操_图片上面定位文字

参考实现的效果是这样的&#xff1a; 目前还没有学到渐变色&#xff0c;所以标签效果的渐变色没有实现&#xff0c;只是利用radius设置了圆角图形&#xff0c;辅之以背景色和设置其中文本文字的颜色和居中对齐。 在自己写的过程中&#xff0c;对于标签的定位写成了相对定位&a…

RabbitMQ的安装使用

RabbitMQ是什么&#xff1f; MQ全称为Message Queue&#xff0c;消息队列&#xff0c;在程序之间发送消息来通信&#xff0c;而不是通过彼此调用通信。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时&#xff0c;消费者无法快速消费&#xff0c;…

Webpack5入门到原理22:提升打包构建速度

HotModuleReplacement 为什么 开发时我们修改了其中一个模块代码&#xff0c;Webpack 默认会将所有模块全部重新打包编译&#xff0c;速度很慢。 所以我们需要做到修改某个模块代码&#xff0c;就只有这个模块代码需要重新打包编译&#xff0c;其他模块不变&#xff0c;这样…

kafka入门(九):副本

副本 副本&#xff08;Replica&#xff09;&#xff0c;指的是分布式系统对数据和服务提供的一种冗余方式。 Kafka通过多副本机制实现故障自动转移&#xff0c;在Kafka集群中某个broker节点失效的情况下仍然保证服务可用。 kafka 副本之间是 一主多从的关系。 其中 leader 副…

打开json文件,读取里边的每一行数据,每一行数据是一个字典,使用matplotlib画图

这段代码的目的是读取 JSON 文件&#xff0c;提取关键信息&#xff0c;然后使用 Matplotlib 绘制四个子图&#xff0c;分别显示不同的指标随着 iter 变化的情况。这种图形化分析有助于直观地了解模型的性能。 画图结果如下&#xff1a; json文件格式如下&#xff1a;下面只粘贴…

大模型镜像打包实战:CodeGeeX2为例

资源地址 docker torch镜像地址 CodeGeeX2 github 构建思路 查看CodeGeeX2项目&#xff0c;官方已经提供好启动脚本&#xff0c;配置好各种依赖应该就可以运行。 python ./demo/run_demo.pyusage: run_demo.py [-h] [--model-path MODEL_PATH] [--example-path EXAMPLE_PAT…