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 应用程序。

阅读剩余 63%

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

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

相关文章

  • java计算两个日期中间的时间

    如果想要计算两个日期中间的时间,可以使用Java的Date和Calendar类来处理,具体步骤如下: 使用SimpleDateFormat类将输入的两个日期字符串转换为Date对象。 String startDate = "2021-01-01"; String endDate = "2021-06-30"; Simp…

    Java 2023年5月20日
    00
  • 常见JavaWeb安全问题和解决方案

    常见JavaWeb安全问题和解决方案 引言 JavaWeb应用的普及使其突显出越来越多的安全威胁。在开发JavaWeb应用时,我们需要考虑如何确保安全才能更好地保护用户个人信息和应用程序数据。本攻略为您提供了一些常见的JavaWeb安全问题和解决方案,希望对您有所帮助。 常见JavaWeb安全问题 SQL注入 SQL注入是一种常见的安全威胁,攻击者可以利用这…

    Java 2023年5月27日
    00
  • java中的Io(input与output)操作总结(三)

    标题:Java中的IO(Input与Output)操作总结(三) 概述 在Java中,IO是一项重要的操作。在前两篇文章中,我们讲解了Java中的Input与Output操作。本文将为大家介绍Java中的文件操作、Socket网络编程以及序列化操作。 文件操作 Java中,我们通过File类实现文件操作。首先,我们需要使用构造函数创建一个File对象,进而对…

    Java 2023年5月26日
    00
  • Java中批处理框架spring batch详细介绍

    Java中批处理框架Spring Batch详细介绍 什么是Spring Batch? Spring Batch是一个轻量级、全面的批处理框架,用于开发企业级批处理应用程序。它旨在帮助开发人员管理和执行大规模批处理任务,其中包括读取大量数据、处理复杂计算和写回结果等任务。Spring Batch提供了许多功能,如任务调度、处理日志和抽象化数据源的读取和写入,…

    Java 2023年5月19日
    00
  • 详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作

    下面就针对所提到的 MyBatis 的几个关键点展开讲解。 getMapper() 接口 getMapper() 接口是 MyBatis 通过动态代理将 Mapper 接口和 XML 配置文件绑定在一起。这样每次调用的时候就可以直接使用对象调用 Mapper 中的方法,并且 MyBatis 会自动帮我们调用 SQL 语句。下面是一个示例: public in…

    Java 2023年5月20日
    00
  • Java轻松掌握面向对象的三大特性封装与继承和多态

    Java是一门面向对象编程语言,而面向对象编程的三大特性为封装、继承和多态。下面将为大家介绍如何轻松掌握这三大特性。 封装 封装是指将类的属性和方法包装在一起,隐藏了类的实现细节,使得类的使用者只需关注类的功能而不必关心其内部实现。Java中可以通过public、private、protected、default等访问修饰符来实现封装。 以下是一个示例代码,…

    Java 2023年5月26日
    00
  • 详解SpringBoot是如何整合SpringDataRedis的?

    首先需要了解Spring Boot和Spring Data Redis的概念: Spring Boot是Spring Framework的一个开源轻量级框架,可用于构建基于Java的Web应用程序,它提供了自动化的配置和快速的应用程序启动能力。 Spring Data Redis是Spring Data家族框架之一,提供了简单的方式与Redis数据库进行集成…

    Java 2023年5月20日
    00
  • Hibernate悲观锁和乐观锁实例详解

    下面是“Hibernate悲观锁和乐观锁实例详解”的完整攻略: 一、悲观锁的概念 悲观锁是一种传统的锁处理方式,其核心思想是对于所操作的数据持有独占锁,避免其他线程在同一时间对该数据进行修改,以达到保证数据操作的完整性和一致性的目的。为了实现对数据的独占性,悲观锁会在数据操作时将其锁定,从而其他线程无法对该数据进行修改,直到该线程完成操作并释放锁为止。 Hi…

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