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日

相关文章

  • Java重写(Override)与重载(Overload)区别原理解析

    下面是详细讲解“Java重写(Override)与重载(Overload)区别原理解析”的攻略: Java重写(Override)与重载(Overload)区别原理解析 一、重写(Override) 1.1 定义 Java中,当子类继承父类时,如果子类需要覆盖(重写)父类中的方法,就需要使用重写。重写是指在子类中重新定义的方法覆盖在父类中定义的同名方法。 1…

    Java 2023年5月26日
    00
  • 在Java的Struts框架中ONGL表达式的基础使用入门

    对于在Java的Struts框架中ONGl表达式的基础使用入门,我将提供以下攻略: 一、什么是Struts框架 Struts框架是一个基于模型-视图-控制器(MVC)的web应用程序框架。它由Apache软件基金会开发,并且拥有活跃的社区支持和用户。它允许开发人员分离业务逻辑和用户界面,从而使开发人员能够更专注于他们的核心业务。 二、什么是OGNL表达式 O…

    Java 2023年5月20日
    00
  • cookie、session和java过滤器结合实现登陆程序

    实现登陆程序需要用到cookie、session和java过滤器,下面是实现登陆程序的完整攻略: 1.理解cookie和session Cookie是一小段文本信息,存在客户端浏览器上,用于存储一些关于用户的信息。一个浏览器对于同一个cookie的请求都会带上这个cookie。 Session是一种在服务器端保存用户数据的解决方案。Session的工作流程为…

    Java 2023年6月15日
    00
  • Java实现简单酒店管理系统

    Java实现简单酒店管理系统 概述 在本教程中,我们将使用Java语言实现一个简单的酒店管理系统,包括以下功能: 添加/查询客房信息 预订客房 退房 我们将使用OOP开发方法,并实现以下几个类: Room:客房类,包括房间号、是否入住、房间类型等属性 Hotel:酒店类,包括所有客房列表等属性和行为 Receptionist:前台类,负责处理客户请求 细节 …

    Java 2023年5月18日
    00
  • 详解Java类加载器与双亲委派机制

    详解Java类加载器与双亲委派机制 Java类加载器是Java虚拟机(JVM)的一个重要组成部分。类加载器负责将class文件从文件系统、网络等位置加载到内存中的虚拟机中,从而使得Java程序能够正确运行。在Java中,类加载器采用了“双亲委派机制”(Parent Delegation Model)来管理和加载类。 双亲委派机制 Java类加载器通过双亲委派…

    Java 2023年6月15日
    00
  • 详解基于Spring Data的领域事件发布

    以下是《详解基于Spring Data的领域事件发布》的完整攻略: 1. 概述 领域事件 领域事件是指在领域中发生的一些重要操作或数据变化,如订单创建、库存减少等。它们可以触发其他业务逻辑,也可以被其他业务逻辑订阅并处理。 Spring Data Spring Data 是 Spring 社区为简化数据库访问和实现数据持久化的开源框架。它提供了丰富的 API…

    Java 2023年5月20日
    00
  • spring boot 配置动态刷新详解

    SpringBoot配置动态刷新详解 在SpringBoot应用程序中,我们通常需要对配置进行修改,但是修改后需要重启应用程序才能生效,这对于生产环境来说是不可接受的。为了解决这个问题,SpringBoot提供了配置动态刷新功能,可以在不重启应用程序的情况下更新配置。本文将详细介绍SpringBoot配置动态刷新的实现原理和使用方法。 实现原理 Spring…

    Java 2023年5月15日
    00
  • Java实现计算一个月有多少天和多少周

    确定一个月有多少天和多少周是一个常见的问题。在Java中可以通过一些基本的语法和时间API来实现。下面我们来详细讲解如何实现计算一个月有多少天和多少周。 计算月份天数 Java中可以使用Calendar类来计算月份天数。具体步骤如下: 获取当前时间,使用Calendar.getInstance()方法获取。例如:Calendar cal = Calendar…

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