springboot 集成jwt的使用

news2024/10/5 13:00:30

1.JWT介绍

JWT(JSON Web Token)是一种基于JSON格式的身份验证和授权标准,经常用于Web应用程序中的用户身份验证。JWT由三个部分组成:头部、载荷和签名。头部包含算法和类型信息,载荷包含用户数据和元数据,签名则是基于头部和载荷计算得出的,在身份验证时用于验证请求是否是合法的。

JWT是一种轻量级、简单、可扩展的身份验证机制,具有良好的互操作性和各种编程语言中的广泛支持。可以在前端使用JavaScript生成JWT并在后端进行验证,也可以在后端使用Java、Python等语言生成和验证JWT。同时,JWT具有良好的安全性能,防止了跨站点脚本(XSS)和跨站点请求伪造(CSRF)等攻击。

1.1JWT的主要用于两个用途:

  • 数据交换:因为JWT使用JSON来存储相关数据,而JSON这一种数据格式可以在各方之间传递。
  • 安全验证:登录之后,后续的请求可以携带JWT,只有携带了JWT(认证Token)的请求才能够正常地访问到相关的数据及资源。

一般我们在开发过程中,凡是涉及到用户登录的,我们就需要去考虑用什么去存储用户登录的一个状态,两种策略:

  • session(基于cookie的实现):只不过session相关的数据存储于服务器。采用session这种方式,是以本地缓存来存储相关的数据的,当有100个用户进行登录的时候,就需要在本地缓存存储100个信息。因此会给服务器带来一定的内存压力。
  • JWT:一旦生成,一般就抛给客户端去保存。客户端只需要每次携带这个Token就可以正常地访问接口。

1.2JWT的优点

  • 无状态:服务器不需要在会话中存储任何会话信息,从而降低了服务器的资源开销,也提高了可扩展性;
  • 可扩展性:JWT以JSON为数据格式,可以存储各种格式的数据,例如数组、嵌套JSON对象等,非常适合扩展;
  • 安全性好:JWT支持签名和加密机制,可以防止请求被篡改或伪造。
  • 跨平台支持:JWT是基于JSON格式的标准,并且是独立于编程语言的,非常适合跨平台使用。

1.3JWT的缺点

  • 安全性取决于密钥的保护:JWT的安全性取决于密钥的保护,如果密钥泄漏,攻击者就可以伪造有效的JWT,从而通过身份验证。
  • 载荷不能加密:JWT中的载荷是未加密的,因此可能会将敏感数据暴露给未经授权的人员。

总之,JWT以其轻量级、可扩展、跨平台的优点成为了Web应用程序中常用的身份验证机制,但在使用时需要注意密钥的保护以及不将敏感数据放在JWT的载荷中。

在这里插入图片描述

2JWT 使用

2.1依赖

<dependency>
			<groupId>com.auth0</groupId>
			<artifactId>java-jwt</artifactId>
			<version>4.2.2</version>
		</dependency>

2.2代码

package com.lys.lys_admin_api.common.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;

/**
 * jwt 在线解析 http://jwt.calebb.net/
 */
public class JWTUtils {
    public static final String SECRET = "liuyunshengsir";

    public static void main(String[] args) {
        String a="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImxpdXl1bnNoZW5nc2lyIiwiZXhwIjoxNjg0ODk2MDI2LCJ1c2VySWQiOiIxMTExMTExIn0.nMQiL9wRaDyRCf1zD1HL9vEixWNGR4AiDt0JCJcB5GE";
        getJWT();
        readJWT(a);
    }

    public static String getJWT(){
        Calendar expires = Calendar.getInstance();
        expires.add(Calendar.SECOND, 60);

        String jwtToken = JWT.create()
                // 第一部分Header
                .withHeader(null)
                // 第二部分Payload
                .withClaim("userId", "1111111")
                .withClaim("userName", "liuyunshengsir")
                .withExpiresAt(expires.getTime())
                // 第三部分Signature
                .sign(Algorithm.HMAC256(SECRET));
        System.out.println(jwtToken);
        return jwtToken;
    }

    public static void readJWT(String str){
        // 创建一个验证的对象
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
        DecodedJWT verify = jwtVerifier.verify(str);
        System.out.println(verify.getClaim("userId").asString());
        System.out.println(verify.getClaim("userName").asString());
        System.out.println("过期时间:" + verify.getExpiresAt());
    }


}

3.异常

常见的异常
这里贴出4个常见的异常,如果JWT校验不通过,就会抛出异常:

  • SignatureVerificationException:签名不一致。
  • TokenExpiredException:令牌过期。
  • AlgorithmMismatchException:算法不匹配异常。
  • InvalidClaimException:失效的Payload异常。一般存在于这种情况:获取token的服务器比使用token的服务器时钟快,请求分发到时间慢的服务器上导致token还没生效。

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

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

相关文章

tolua源码分析(六) C#委托使用lua函数的机制实现

tolua源码分析&#xff08;六&#xff09; C#委托使用lua函数的机制实现 上一节我们讨论lua层如何使用C#的enum以及使用enum需要注意的事项。这一节我们将讨论项目日常开发中经常会用到的委托注册机制&#xff0c;即C#层暴露若干委托和事件&#xff0c;然后在lua层进行注册&…

【沐风老师】3DMAX宇宙生成器(一键生成星系)插件使用方法详解

3DMAX宇宙生成器&#xff08;一键生成星系&#xff09;插件 3DMAX宇宙生成器&#xff08;一键生成星系&#xff09;插件&#xff0c;用于模拟星团及星系的运动。可以创建单个集合进行动画计算&#xff0c;也可以输入不同坐标&#xff0c;建立多个集合后统一进行动画计算。 【安…

探索iOS之CoreImage框架

CoreImage提供图像处理、人脸识别、图像增强、图像滤镜、图像转场。它操作的数据来自Core Graphics、Core Video、Image IO&#xff0c;使用CPU或GPU进行渲染。CoreImage对底层实现进行封装&#xff0c;为上层提供简单易用的API。 一、CoreImage框架 CoreImage框架分为&#…

计算机电脑中了勒索病毒,如何提高windows系统预防faust勒索病毒的能力

当今社会互联网技术迅猛发展&#xff0c;但随之而来的网络安全问题开始引起人们的重视&#xff0c;其中,勒索软件是当前网络安全领域中最具破坏性和危害性的恶意软件之一&#xff0c;而Faust勒索软件就是其中一种。 Faust勒索病毒是一种很可怕的恶意软件&#xff0c;能够破坏并…

计算机网络 - 网络层的数据平面

Overview 首先Network Layer负责的是host to host的传输, 然后可以分为两个平面, 控制平面以及数据平面. 数据平面: 负责forward datagrams from input to output links 决定路由器从input到output 转发功能: 基于目标地址 转发表 SDN方式基于多个字段流表 控制平面: 调…

第10届蓝桥杯Scratch省赛真题集锦

编程题 第 1 题 问答题 击鼓游戏 题目说明 准备工作: 将复台背景设置为“spotight-stage”&#xff0c;添加一个“Belerina"角色、两个“Drum1"角色和两个“Drum2”角色&#xff0c;并按照图 7-1 的位置摆放。角色“Beleina"的造型和颜色的设置须如图 7-1所示&a…

美女放电还是整形-从《人月神话》误译谈状态机图

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 在重审《人月神话》中译本的过程中&#xff0c;发现一处较严重的误译。 原文是&#xff1a; the first milepost is not reached until two months have elapsed. 原译为&#xff1a; 两个月…

Java中常量基础知识

1 问题 什么是字面常量&#xff1f; 2 方法 拿第一行输出语句来说&#xff0c;这行代码输出了 “hello” 这个字符串&#xff0c;无论何时何地运行程序&#xff0c;输出的这个字符串都不会变&#xff0c;这就是字面常量。 定义&#xff1a;常量即程序运行期间&#xff0c;固定不…

chatgpt网站优选集合

目录 chatGpt 国内镜像网站集合 chatgpt接入微信 chatgpt接入谷歌浏览器 chatgptAI绘画 最后 chatGpt 这个说实话&#xff0c;不用我介绍大家也都懂。不如玩一个有意思的&#xff0c;这里我让chatGpt自己介绍一下他自己&#xff1a; 嗨&#xff0c;大家好&#xff0c;我是…

C++ [STL之vector模拟实现]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT STL之vector模拟实现 前言正文空间结构默认成员函数构造函数拷贝构造函数赋值重载析构函数关于数据拷贝问题 迭代器容量操作查询容量容量操作 数据访问下标访问头尾数据访问 数据增删尾插尾删重…

学懂缓存雪崩,缓存击穿,缓存穿透仅需一篇,基于Redis讲解

在了解缓存雪崩、击穿、穿透这三个问题前&#xff0c;我们需要知道为什么我们需要缓存。在了解这三个问题后&#xff0c;我们也必须知道使用Redis时&#xff0c;如何解决这些问题。 所以我将按照"为什么我们需要缓存"、"什么是缓存雪崩、击穿、穿透"、&qu…

Linux学习笔记 --- Linux基础命令Part1

一. Linux的目录结构 目标&#xff1a;1. 掌握Linux系统的目录结构 2. 掌握Linux系统的路径表达形式 1.1 Linux系统的目录结构 我们知道&#xff0c;在操作系统中&#xff0c;文件系统的目录结构一般都是树形结构。Linux的目录结构是一个树型结构Windows 系统可以拥有多…

如何使用wireShark抓取还原文件

简介 WireShark的追踪流功能可以帮我们抓取从网络上下载的各种文件&#xff0c;接下来就演示下如何抓取并且进行还原。 使用Nginx搭建文件存储服务器 只要是通过http网站下载的包&#xff0c;都可以通过追踪流工具进行抓取。这里为了演示&#xff0c;临时搭建一个Nginx文件存…

Yolov8涨点技巧:MobileViTAttention助力小目标检测,涨点显著,MobileViT移动端轻量通用视觉transformer

在​crack缺陷检测项目原始0.739提升至 0.772 ,涨点明显,博主多个数据集亲测有效,实现暴力涨点; 现有博客都是将MobileViT作为backbone引入Yolov5,因此存在的问题点是训练显存要求巨大,本文引入自注意力的Vision Transformer(ViTs):MobileViTAttention 1. MobileViT介绍…

English Learning - L3 作业打卡 Lesson3 Day18 2023.5.22 周一

English Learning - L3 作业打卡 Lesson3 Day18 2023.5.22 周一 引言&#x1f349;句1: People said my mother was “a good egg”.成分划分弱读连读语调 &#x1f349;句2: She would always help anyone in need.成分划分连读语调 &#x1f349;句3: We never had to “walk…

1、MQTT协议入门以及mosquitto示例

1.什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xf…

一款好看的markdown编辑器:md-editor-v3

文章目录 md-eidtor-v3地址其它markdown编辑器&#x1f384; md-editor-v3⭐️ 功能一览&#x1f4e6; 安装&#x1f4a1; 用法✍&#x1f3fb; 编辑器模式&#x1f4d6; 仅预览模式 &#x1f5fa; 预览图&#x1f381; Apis&#x1f516; MdPreivew Props&#x1f529; MdEdit…

c++基础概念,const与指针、引用的关系,auto,decltype关键字能干啥总得了解吧。总得按照需求自定义创建实体类,自己编写头文件吧

const限定符 有时我们希望定义这样一种变量&#xff0c;它的值不能被改变。例如&#xff0c;用一个变量来表示缓冲区的大小。使用变量的好处是当我们觉得缓冲区大小不再合适时&#xff0c;很容易对其进行调整。另一方面&#xff0c;也应随时警惕防止程序一不小心改变了这个值。…

邂逅Webpack和打包过程

1 认识webpack工具 2 webpack基本打包 3 webpack配置文件 4 编写和打包CSS文件 5 编写和打包LESS文件 6 postcss工具处理CSS 从脚手架打包成普通的htmlcssjs文件 内置模块path&#xff1a; 拼接路径 const path require("path")const filepath "C://abc/…

Systrace系列9 —— MainThread 和 RenderThread 解读

本文是介绍 Android App 中的 MainThread 和 RenderThread,也就是大家熟悉的主线程和渲染线程。文章会从 Systrace 的角度来看 MainThread 和 RenderThread 的工作流程,以及涉及到的相关知识:卡顿、软件渲染、掉帧计算等。 这里以滑动列表为例 ,我们截取主线程和渲染线程一…