java使用JWT的方法

Java应用需要进行用户验证和授权时,常用的方案之一是使用JWT(JSON Web Token)。JWT是一种基于JSON格式的安全传输令牌,通过使用JWT能够实现用户身份认证和授权信息的传递。

以下是Java使用JWT的方法的完整攻略。

1. 导入相关依赖

为了使用JWT,我们需要在Java应用中导入相关依赖。可以通过在maven的pom.xml文件中添加以下依赖来完成此操作。

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

2. 创建JWT Token

在Java中,可以使用jjwt库来创建JWT Token。示例代码如下:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public static String createJWT(String id, String issuer, String subject, long ttlMillis, String secretKey) {

    // 在ttlMillis毫秒后过期
    long nowMillis = System.currentTimeMillis();
    Date now = new Date(nowMillis);

    // 利用id和密钥创建加密的签名密钥
    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretKey);
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());

    // 设置JWT的头部
    JwtBuilder builder = Jwts.builder()
            .setId(id)
            .setIssuedAt(now)
            .setSubject(subject)
            .setIssuer(issuer)
            .signWith(SignatureAlgorithm.HS256, signingKey);

    // 添加过期时间
    if (ttlMillis >= 0) {
        long expMillis = nowMillis + ttlMillis;
        Date exp = new Date(expMillis);
        builder.setExpiration(exp);
    }

    // 生成JWT并返回
    return builder.compact();
}

3. 解析JWT Token

在Java中,可以使用jjwt库来解析JWT Token。示例代码如下:

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

public static Claims parseJWT(String jwt, String secretKey) {

    // 利用密钥解密JWT
    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretKey);
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());

    // 解析JWT并返回
    return Jwts.parser()
            .setSigningKey(signingKey)
            .parseClaimsJws(jwt).getBody();
}

示例1:JWT的生成和解析

假设我们需要生成和解析一个JWT,该JWT的载荷包含用户ID、用户名和过期时间。我们可以使用以下代码来完成此操作:

// 密钥
String secretKey = "thisIsASecretKey";

// 生成JWT
String jwt = createJWT("userId", "issuer", "userName", 3600000, secretKey);
System.out.println("JWT: " + jwt);

// 解析JWT
Claims claims = parseJWT(jwt, secretKey);
System.out.println("UserId: " + claims.getId());
System.out.println("Issuer: " + claims.getIssuer());
System.out.println("UserName: " + claims.getSubject());
System.out.println("ExpireTime: " + claims.getExpiration());

示例2:使用过滤器验证用户信息

在Java Web应用中,通常会在请求被处理之前使用过滤器对用户进行验证。下面是一个通过JWT Token进行用户验证的过滤器示例。

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

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "authFilter", urlPatterns = "/api/*")
public class AuthFilter implements Filter {

    private String secretKey = "thisIsASecretKey";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        String jwt = request.getHeader("Authorization");
        if (jwt != null && jwt.startsWith("Bearer ")) {
            jwt = jwt.substring(7);
            try {
                Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();
                request.setAttribute("userId", claims.getId());
                request.setAttribute("userName", claims.getSubject());
                filterChain.doFilter(request, response);
            } catch (Exception e) {
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            }
        } else {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        }
    }

    @Override
    public void destroy() {
    }
}

上述过滤器会拦截所有以/api/开头的请求,并从请求头中获取JWT Token进行解析,如果解析成功,则将用户ID和用户名添加到ServletRequest中,否则返回401 Unauthorized状态码。 Web应用中的控制器类可以从ServletRequest中获取用户信息进行后续处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java使用JWT的方法 - Python技术站

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

相关文章

  • ASP中Server.Execute和Execute实现动态包含(include)脚本的区别

    ASP中的Server.Execute和Execute都可以用来实现动态包含(include)脚本的功能,它们的区别主要在于脚本的执行方式和返回值的获取方式。 Server.Execute Server.Execute方法用来执行指定的ASP文件,并将执行结果插入当前页面的位置。 语法:Server.Execute URL [, includeBoolean…

    Java 2023年6月15日
    00
  • 手撸一个Spring Boot Starter并上传到Maven中央仓库

    手撸一个Spring Boot Starter并上传到Maven中央仓库,可以大致分成以下步骤: 一、准备工作 1. 创建一个Maven项目 在本地创建一个Maven项目,包含一个POM文件和一个src目录。可以使用Eclipse、IntelliJ IDEA等开发工具,也可以手工创建。 2. 引入相关依赖 在POM文件中引入Spring Boot和相关依赖,…

    Java 2023年5月19日
    00
  • Spring Boot Maven 打包可执行Jar文件的实现方法

    实现Spring Boot Maven打包成可执行Jar文件的实现方法,主要有两种。 1. 使用Spring Boot Maven插件打包 首先,需要在pom.xml文件中,引入Spring Boot Maven插件,具体如下: <build> … <plugins> … <plugin> <groupId&…

    Java 2023年5月20日
    00
  • jsp获取url路径的方法分析

    当我们进行网站开发时,经常需要获取当前页面的URL路径。在JSP中,获取URL路径的方法有多种,其中包括以下几种常用方法: 方法一:使用request对象获取URL路径 通过request对象的方法getRequestURL()可以获取当前页面完整的URL路径,通过getRequestURI()可以获取相对路径。 示例代码如下: <% String u…

    Java 2023年6月15日
    00
  • 一文详解密码的正则表达式写法

    下面是“一文详解密码的正则表达式写法”的完整攻略。 密码的正则表达式写法 在网站开发中,密码是必不可少的登录认证方式。为了增加用户的账号安全性,通常会限制用户使用具有一定强度的密码。在这种情况下,我们需要使用正则表达式来检查密码的强度。 下面是一个符合标准的密码格式: 长度不少于8个字符 至少包含一个大写字母、一个小写字母、一个数字和一个特殊符号 以下是符合…

    Java 2023年6月15日
    00
  • SpringBoot MyBatis保姆级整合教程

    SpringBoot MyBatis整合教程可以分为以下几个步骤: 1. 创建SpringBoot工程 在开始整合Mybatis之前,我们需要先创建一个SpringBoot工程。可以通过Spring Initializr来进行创建,在创建时我们需要添加Web、Mybatis以及MySQL Driver这三个依赖。 2. 配置数据源 在application.…

    Java 2023年5月20日
    00
  • Spring Security 中如何让上级拥有下级的所有权限(案例分析)

    什么是Spring Security Spring Security是一个基于Spring框架提供的安全性解决方案,实现了通用的安全功能,例如身份验证、授权、加密等等。它提供了一组用于Web应用程序中的库和API,以便实现许多常见的安全场景,以及为自定义安全需求提供支持的扩展点。 Spring Security中如何让上级拥有下级的所有权限 在Spring …

    Java 2023年5月20日
    00
  • 教你怎么用SpringBoot+Mybati-Plus快速搭建代码

    感谢您对使用SpringBoot+MyBatis-Plus进行快速代码搭建的关注,以下是使用这个技术栈进行代码搭建的攻略: 1. 准备工作 在开始使用SpringBoot和MyBatis-Plus进行开发之前,需要先完成以下准备工作: 安装JDK,安装Maven或者Gradle(本文以Maven为例) 创建数据库表和准备好数据 2. 创建SpringBoot…

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