使用springboot解释什么是jwt

news2024/9/30 21:27:31

目录

  • 使用springboot解释什么是jwt
    • 简介
    • 组成结构
    • 在springboot中的作用
        • 1. 添加依赖 在`pom.xml`文件中添加以下依赖
        • 2. 配置JWT 在Spring Boot的配置文件中配置JWT的相关参数,例如密钥、过期时间等:
        • 3. 创建JWT工具类 创建一个JWT工具类,用于生成和解析JWT:
        • 4. 创建控制器 创建一个控制器,用于生成JWT和验证JWT:
        • 5. 测试接口 使用Postman等工具测试接口

使用springboot解释什么是jwt

在这里插入图片描述

简介

JWT全称为JSON Web Token,是一种基于JSON格式的轻量级的身份认证和授权机制。它由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature),通常使用点号(.)将这三部分连接起来形成一个字符串。其中,头部通常包含加密算法和token类型等信息,载荷通常包含用户信息和权限等数据,签名则是对头部和载荷的加密结果。JWT常用于Web应用的身份认证和授权,客户端通过在请求头中携带JWT向服务器进行身份验证并获取资源。由于JWT是无状态的,因此可以实现跨域请求和分布式系统的身份认证和授权。

组成结构

jwt令牌由三个部分组成,分别是:

header:令牌头部,记录了整个令牌的类型和签名算法
payload:令牌负荷,记录了保存的主体信息,比如你要保存的用户信息就可以放到这里
signature:令牌签名,按照头部固定的签名算法对整个令牌进行签名,该签名的作用是:保证令牌不被伪造和篡改
它们组合而成的完整格式是:header.payload.signature
下面是一个具体的JWT示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

这个JWT由三部分组成,用点号(.)分隔:

  • 头部(Header):eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

  • 载荷(Payload):eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

  • 签名(Signature):SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 其中,头部和载荷都是使用Base64Url编码后的JSON字符串,可以使用Base64Url解码得到原始的JSON数据。例如,上面的头部可以解码为以下JSON格式:

{
  "alg": "HS256",
  "typ": "JWT"
}

这表示该JWT使用HS256算法进行签名,并且类型为JWT。而载荷可以解码为以下JSON格式:

  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

这表示该JWT的主题为"1234567890",用户名为"John Doe",签发时间为2018年1月18日 22:23:42。而签名则是对头部和载荷的加密结果,可以使用密钥进行解密得到原始数据。

在springboot中的作用

在Spring Boot中使用JWT的具体案例如下:

1. 添加依赖 在pom.xml文件中添加以下依赖

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

2. 配置JWT 在Spring Boot的配置文件中配置JWT的相关参数,例如密钥、过期时间等:

jwt:
  secret: mySecretKey
  expiration: 3600

3. 创建JWT工具类 创建一个JWT工具类,用于生成和解析JWT:

@Component
public class JwtUtils {
    @Value("${jwt.secret}")
    private String secret;
    @Value("${jwt.expiration}")
    private long expiration;
    public String generateToken(UserDetails userDetails) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("sub", userDetails.getUsername());
        claims.put("iat", new Date());
        claims.put("exp", new Date(System.currentTimeMillis() + expiration * 1000));
        return Jwts.builder()
                .setClaims(claims)
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }
    public String getUsernameFromToken(String token) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getSubject();
    }
    public boolean validateToken(String token, UserDetails userDetails) {
        String username = getUsernameFromToken(token);
        return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
    }
    private boolean isTokenExpired(String token) {
        Date expirationDate = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getExpiration();
        return expirationDate.before(new Date());
    }
}

这个工具类中包含了生成JWT、解析JWT和校验JWT的方法。其中,生成JWT时将用户信息存储在载荷中,解析JWT时可以获取到载荷中存储的用户信息。

4. 创建控制器 创建一个控制器,用于生成JWT和验证JWT:

@RestController
@RequestMapping("/auth")
public class AuthController {
    @Autowired
    private AuthenticationManager authenticationManager;
    @Autowired
    private JwtUtils jwtUtils;
    @PostMapping("/login")
    public ResponseEntity<?> authenticateUser(@RequestBody LoginRequest loginRequest) {
        Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));
        SecurityContextHolder.getContext().setAuthentication(authentication);
        String jwt = jwtUtils.generateToken((UserDetails) authentication.getPrincipal());
        return ResponseEntity.ok(new JwtResponse(jwt));
    }
    @GetMapping("/user")
    public ResponseEntity<?> getUser(@RequestHeader("Authorization") String token) {
        String username = jwtUtils.getUsernameFromToken(token.substring(7));
        User user = new User(username);
        return ResponseEntity.ok(user);
    }
}

这个控制器中包含了一个登录接口和一个获取用户信息的接口。登录接口会校验用户名和密码,并生成JWT返回给客户端;获取用户信息的接口会根据JWT中的用户信息返回相应的用户信息。

5. 测试接口 使用Postman等工具测试接口

  • 登录接口:发送POST请求到/auth/login,请求体为JSON格式的登录信息:
{
  "username": "admin",
  "password": "admin"
}

如果登录成功,会返回如下格式的JWT

{
  "token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTYzOTU5Mzg5MiwiZXhwIjoxNjM5NjAzODkyfQ.7jKbW8uZwVnNpDxgFv7Ll-W1eQ2m9y9XzjvP8vejJZw"
}

获取用户信息接口:发送GET请求到/auth/user,请求头中携带JWT:

Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTYzOTU5Mzg5MiwiZXhwIjoxNjM5NjAzODkyfQ.7jKbW8uZwVnNpDxgFv7Ll-W1eQ2m9y9XzjvP8vejJZw

如果JWT有效,会返回如下格式的用户信息:

{
  "username": "admin"
}

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

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

相关文章

数据治理体系建设

01 数据治理建设路径 1. 业务数字化的目的是打造一体化的业务流、信息流与数据流 从企业整体经营管理的角度&#xff0c;战略制定及分解—领域业务目标制定—业务方案设计—业务需求识别 & 信息系统功能及数据库设计—数据汇聚及分析—业务目标监测及改善&#xff0c;这个…

Mysql安装详细教程

数据库相关概念 而目前主流的关系型数据库管理系统的市场占有率排名如下&#xff1a; Oracle&#xff1a;大型的收费数据库&#xff0c;Oracle公司产品&#xff0c;价格昂贵。 MySQL&#xff1a;开源免费的中小型数据库&#xff0c;后来Sun公司收购了MySQL&#xff0c;而Oracle…

PEIS体检管理系统源码,自主知识产权,文档齐全,功能完善

PEIS体检管理系统源码&#xff0c;自主知识产权&#xff0c;文档齐全&#xff0c;有演示。 体检条码化管理&#xff0c;体检数据比对&#xff0c;丰富的诊断模板&#xff0c;自动产生小结、综述和建议。 文末获取联系&#xff01; PEIS体检管理系统对医院体检中心进行系统化和…

java二维数组遍历

在 java中&#xff0c;二维数组是指在二维平面上的一个数组。在二维数组中&#xff0c;数据都是按行排序的。我们通常可以用“从上到下”、“从左到右”、“从后到前”等方法来遍历二维数组。由于二维数组中数据的有序性&#xff0c;我们可以在二维数组中快速地找到我们所需要的…

手机穿戴设备能力共享,提升丰富交互体验

HUAWEI Wear Engine面向手机和穿戴设备的应用与服务开发者&#xff0c;提供华为穿戴设备开放能力。 开发者通过调用Wear Engine开放能力&#xff0c;可以实现手机上的生态应用与服务给华为穿戴设备发消息、发通知、传输数据&#xff0c;并获取穿戴设备状态、读取传感器数据等&…

65W氮化镓(GaN)充电头PD快充方案

2023年数码圈中讨论较多的莫过于65W氮化镓&#xff08;GaN&#xff09;充电头。65W快充是目前快充市场出货的主流规格&#xff1b;氮化镓具有高可靠性&#xff0c;能够承受短时间过压&#xff1b;将GaN用于充电器的整流管后&#xff0c;能降低开关损耗和驱动损耗&#xff0c;提…

超清大屏沉浸音效,用极米H6 4K版看剧更有代入感

近日&#xff0c;由张译主演的悬疑剧《他是谁》开播&#xff0c;该剧主要讲述了以卫国平(张译饰)为首的刑警坚持不懈8年追凶&#xff0c;帮受害者讨回公道的故事。《狂飙》作为现象级爆款剧落幕不久&#xff0c;饰演刑警安欣的影帝张译&#xff0c;又在悬疑剧《他是谁》中主演刑…

本地套接字(domain)

本地套接字是一种特殊类型的套接字&#xff0c;和 TCP/UDP 套接字不同。TCP/UDP 即使在本地地址通信&#xff0c;也要走系统网络协议栈&#xff0c;而本地套接字&#xff0c;严格意义上说提供了一种单主机跨进程间调用的手段&#xff0c;减少了协议栈实现的复杂度&#xff0c;效…

consul集群搭建教程

简言 1. 使用consul单节点有宕机&#xff0c;数据丢失的风险&#xff0c;为了安全&#xff0c;使用consul集群更靠谱 2. consul的各个版本下载地址在 Consul Versions | HashiCorp Releases 3. 本文使用consul的版本是consul1.15.1&#xff0c;所以请下载名字为 consul_1.15…

数据密集型应用存储与检索设计

本文内容翻译自《数据密集型应用系统设计》&#xff0c;豆瓣评分高达 9.7 分。 什么是「数据密集型应用系统」&#xff1f; 当数据&#xff08;数据量、数据复杂度、数据变化速度&#xff09;是一个应用的主要挑战&#xff0c;那么可以把这个应用称为数据密集型的。与之相对的是…

免费文本转语音(在线文本转语音)

个人开发的网站&#xff0c;已经维护快一年了&#xff0c;接口稳定&#xff0c;基于微软官方接口&#xff0c;可在线生成&#xff0c;手机电脑平板通用。每天提供一定额度&#xff08;时而5000时而2000时而500&#xff0c;根据服务器压力调整&#xff09;的免费字数供大家使用。…

数画-AI绘画-免费的人工智能AI绘画网站

文章目录 AIGC什么是AI作画&#xff1f;Prompt数画AIGC的未来发展结语 AIGC AIGC&#xff08;AI Generated Content&#xff09;是指利用人工智能生成内容。是利用人工智能来生成你所需要的内容&#xff0c;GC的意思是创作内容。与之相对应的概念中&#xff0c;比较熟知的还有P…

瑞芯微RK3568对比RK3399性能解析

RK3568核心板简介 ​ RK3568核心板是武汉万象奥科基于瑞芯微Rockchip的RK3568设计的一款高性能核心板。它采用四核Cortex-A55架构&#xff0c;最高主频可达2.0GHz&#xff0c;同时集成Mali-G52 2EE GPU&#xff0c;支持4K60fps H.265/H.264/VP9解码和4K60fps H.265/H.264编码…

北大POJ 1000 ~ 1007

1. AB &#x1f351; POJ1000 ab &#x1f354; 签到题 import java.io.*; import java.util.*; public class Main {public static void main(String args[]) throws Exception{Scanner cinnew Scanner(System.in);int acin.nextInt(),bcin.nextInt();System.out.println(…

【Vue3】Vue项目各个配置文件的相关用途

通过Vue Cli创建好初始代码后&#xff0c;对于各个文件以及配置文件的用途&#xff0c;比较模糊。弄清楚配置文件的大致作用&#xff0c;十分有利于项目整体性的把控&#xff0c;在实际项目中例如修改配色、样式、统一页面结构等&#xff0c;都可以事半功倍。 1、package.json …

分享下这些软件外包公司(2023最新版),程序员有福了

金三银四已经过去一半&#xff0c;再过几个月又将迎来毕业季&#xff0c;大家有没有找到心仪的工作机会呀&#xff1f; 今年找工作的行情确实不行&#xff0c;在网上也能听见很多人在讨论说今年工作实在是太难找了。 如果实在找不到合适的工作&#xff0c;那外包也可以考虑下了…

【LeetCode】102.二叉树的层序遍历

1.问题 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a…

Centos7配置静态ip地址

目录 查找配置网络的文件 配置静态ip VMware查找网关ip Windows Mac 查找配置网络的文件 先输入以下命令查看下ip是通过哪个文件来配置的 ip addr 修改网络配置文件&#xff08;注意看我上面查到的是ens32, 所以在ifcfg-后面拼的是这个&#xff09; vi /etc/sysco…

VM——下载 centos

进入centos官网 这里显示了我所在地区可用的ISO镜像&#xff0c;这里我选阿里的镜像库 然后选择centos的版本&#xff0c; 【DVD】标准版本 【Everything】集成所有软件版本 【LiveGNOME】GNOME桌面版本 【LiveKDE】KDE桌面版本 【Minimal】最小安装版本 【NetInstall】网…

Qt Quick - TabBar

Qt Quick - TabBar使用总结 一、概述二、调整选项卡三、Flickable标签三、定制化 一、概述 TabBar其实就是选项卡&#xff0c;TabBar是由TabButton控件填充&#xff0c;TabBar可以与任何提供currentIndex属性的布局或容器控件一起使用&#xff0c;如StackLayout或SwipeView。T…