Java中JWT的使用的详细教程

Java中JWT的使用的详细教程

什么是JWT

JWT(JSON Web Token)是一个轻量级的身份验证和授权方法,它以 JSON 格式传输信息,可以被加密和签名,并具有各自的有效期。

一个 JWT Token 包含有三部分:Header、Payload和Signature。Header 部分是关于这个 Token 的基本信息,包括 Token 使用的算法。Payload 是 JWT 的主体部分,其中存储了实际需要传输的数据。Signature 是对 Header 和 Payload 做签名的结果。

如何使用

引入依赖

首先,我们需要在 pom.xml 中添加如下依赖,以支持 JWT 功能。

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

生成Token

首先,在用户登录成功之后,需要生成一个 JWT Token 并返回给客户端。

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class JwtUtil {
    private static final String SECRET = "my_secret_key";
    private static final long EXPIRATION_TIME = 3600000; // 1 hour

    public static String generateToken(String username) {
        Date expirationDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME);

        String token = Jwts.builder()
                .setSubject(username)
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, SECRET)
                .compact();

        return token;
    }
}

以上代码中,SECRET 是对 JWT Token 进行签名时使用的密钥,EXPIRATION_TIME 是 Token 的有效期。generateToken() 方法将用户名作为 payload,生成一个 JWT Token 并返回。

验证Token

在客户端向服务器发送请求时,需要将 JWT Token 传递给服务器。服务器需要验证这个 Token 是否合法,以保证请求的安全。

import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import java.util.Date;

public class JwtUtil {
    private static final String SECRET = "my_secret_key";

    public static boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
            return true;
        } catch (JwtException e) {
            return false;
        }
    }
}

以上代码中,validateToken() 方法接受一个 JWT Token 作为参数,并返回一个布尔值。如果 Token 合法,返回 true;否则返回 false。

获取Payload中的信息

如果 Token 合法,我们就可以获取其中存储的数据。

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

public class JwtUtil {
    private static final String SECRET = "my_secret_key";

    public static String getUsernameFromToken(String token) {
        Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody();
        return claims.getSubject();
    }
}

以上代码中,getUsernameFromToken() 方法接受一个 JWT Token 作为参数,并返回其中存储的用户名。

使用示例

生成Token

String username = "Alice";
String token = JwtUtil.generateToken(username);
System.out.println(token);

以上代码会生成一个包含用户名为 "Alice" 的 JWT Token,并打印出 Token 的内容。

验证Token和获取Payload

String token = "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJBbGljZSIsImV4cCI6MTU2NjAwMjUzN30.LZwrKpB7LUHhPbW6JUs3gUvM1v7BgxV6cX9ZJF39A_pcj_yER6LWrCpQwWpWk2PbNWQ4WG54ZhFIsr43nUrm2w";


if (JwtUtil.validateToken(token)) {
    String username = JwtUtil.getUsernameFromToken(token);
    System.out.println("Username: " + username);
} else {
    System.out.println("Invalid token");
}

以上代码会先验证 JWT Token 是否合法,如果合法,就会将其中存储的用户名打印出来。

总结

这篇文章简单介绍了如何使用 JWT 来进行用户身份验证和授权。JWT 是一个安全且易于使用的方案,可以广泛应用于各种 Web 应用程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中JWT的使用的详细教程 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Spring事务失效场景原理及解决方案

    Spring事务失效场景原理及解决方案 原理 Spring事务使用AOP实现,核心原理是在程序执行前后动态代理,在方法执行前开启一个事务,在方法执行后根据方法执行结果决定事务是提交还是回滚。但是在以下场景中,Spring事务可能失效: 在事务方法外部调用另一个事务方法时,当前事务被挂起,新的事务启动,第二个事务抛出异常回滚,当前事务并不会回滚。 在catch…

    Java 2023年5月20日
    00
  • 关于Spring中声明式事务的使用详解

    关于Spring中声明式事务的使用详解 什么是声明式事务? 在Spring中,事务是指一组需要保证数据完整性和一致性的数据库操作。 在进行事务处理时,必须保证多个操作的原子性,即所有操作都能够全部成功或全部失败。 Spring中的声明式事务是基于AOP实现的,通过对方法进行拦截,在方法执行前后加上事务的开始和结束语句,来实现事务的管理。这样即使开发人员忘记在…

    Java 2023年5月19日
    00
  • Spring源码分析容器启动流程

    下面是针对“Spring源码分析容器启动流程”的完整攻略。 1. 前言 Spring是一个非常流行的Java开发框架,它最基本的组成部分就是一个IOC容器。在了解Spring的使用过程中,我们需要知道Spring容器启动的过程,这样可以更好的理解Spring的原理和运作机制。 2. Spring容器启动流程概述 Spring容器启动流程可以分为以下几个基本步…

    Java 2023年5月31日
    00
  • Java中的NumberFormatException是什么?

    Java中的NumberFormatException是一个运行时异常,常常发生在字符串通过解析为基本类型时出现格式错误时抛出。 当需要将一个字符串转换为特定类型(如int、long、float、double等)时,如果字符串格式不符合要求,就会抛出NumberFormatException异常。 比如当要将一个包含英文字母的字符串转换为数字类型时,就会触发…

    Java 2023年4月27日
    00
  • 图文详解Java中的字节输入与输出流

    图文详解Java中的字节输入与输出流 什么是字节输入与输出流 在Java中,一个流就是一种数据传输方式。流分为字节流和字符流两种类型。字节输入流和输出流是Java中的一种字节流,主要用于读取和写入字节数据。 既然是字节数据,那么我们可以理解成Java中所有的数据最终都要用二进制的形式进行存储,而字节流就是能够读入/写出(input/output)这些二进制数…

    Java 2023年5月26日
    00
  • Java实现考试系统

    Java实现考试系统攻略 概述 本文介绍如何使用Java实现一个考试系统。该系统包含了以下功能: 单选题和多选题的创建和管理 考试试卷生成和管理 学生考试、交卷和阅卷 系统设计 数据库设计 考试系统需要存储题目、试卷和学生等信息。因此需要设计以下表格: question 表:用于存储题目信息,包括题目内容、选项和正确答案等。 exam 表:用于存储试卷信息,…

    Java 2023年5月19日
    00
  • 关于idea中ssm框架的编码问题分析

    下面我将为你详细讲解关于 IDEA 中 SSM 框架的编码问题分析的完整攻略。 1. 问题背景 在使用 IDEA 开发 SSM 框架项目时,我们有时会遇到编码问题。例如,在提交表单数据时出现乱码、在从数据库查询数据时出现中文乱码等问题。 2. 解决方法 2.1 设置 IDEA 编辑器字符集 我们需要在 IDEA 中设置字符集为 UTF-8,确保编辑器中的代码…

    Java 2023年6月1日
    00
  • Python操作多维数组输出和矩阵运算示例

    Python是一门功能强大的编程语言,拥有许多强大的数学运算工具,其中最重要的便是多维数组和矩阵运算。这篇攻略将会讲解如何在Python中进行多维数组输出和矩阵运算,并提供两个示例说明。 多维数组输出 首先,让我们来看一下多维数组输出的方法。在Python中,可以使用numpy库来创建和操作多维数组。下面是一个简单的例子,展示了如何创建一个二维数组,并将其打…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部