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日

相关文章

  • java中ssj框架的项目搭建流程

    下面就是Java中SSJ框架项目搭建流程的完整攻略: 1. 准备工作 安装Java开发工具包(JDK) 安装集成开发环境(IDE)如IntelliJ IDEA或Eclipse 安装Maven构建工具 2. 新建Maven项目 使用IDE创建新的Maven项目,需要指定Maven坐标,其中包含了项目的各个基本属性,如groupId,artifactId,ver…

    Java 2023年5月20日
    00
  • Java 实战图书管理系统的实现流程

    Java 实战图书管理系统实现流程 本文将给出一个详细的Java 实战图书管理系统实现流程。我们将按照以下五步走进行: 1. 规划 首先我们需要规划我们的图书管理系统将包含哪些功能,这样我们才能更好的开始开发我们的应用程序。我们的规划包括以下几点: 实现基本的图书信息管理功能 包括添加、修改、删除、查询等功能 图书信息应该能方便地导出为Excel文件 实现图…

    Java 2023年5月24日
    00
  • Android实现上传文件功能的方法

    Android实现上传文件功能的方法主要有两种:使用HttpURLConnection或使用OkHttp库。 使用HttpURLConnection上传文件 步骤一:添加网络权限 在AndroidManifest.xml文件中添加以下权限: <uses-permission android:name="android.permission.I…

    Java 2023年6月15日
    00
  • 解决mybatis plus 驼峰式命名规则问题

    当我们使用 MyBatis-Plus 进行开发时,如果数据库中的表和列采用了下划线命名法,则需要搭配驼峰式命名法进行开发,这个过程中就需要解决 MyBatis-Plus 驼峰式命名规则问题。 以下是解决 MyBatis-Plus 驼峰式命名规则问题的完整攻略: 1. 配置文件中开启驼峰命名法 在 MyBatis-Plus 中,我们可以通过在配置文件中开启驼峰…

    Java 2023年5月20日
    00
  • Java Character类对单个字符操作原理解析

    Java Character类对单个字符操作原理解析 在Java中,Character类是一个非常重要的类,主要用于对单个字符的操作。它包含了一些静态方法和实例方法,可以用于判断字符的数字、大小写、空格、是否是字母等,下面我们来详细讲解这个类的一些方法和原理。 Character类的构造方法 Character(char c) 创建一个新的 Characte…

    Java 2023年5月27日
    00
  • SpringMVC通过模型视图ModelAndView渲染视图的实现

    SpringMVC是一种基于MVC架构模式的Web框架,它可以让开发者更加简便地开发Web应用程序。在SpringMVC中,渲染视图是关键步骤之一。SpringMVC借助于视图解析器(ViewResolver)将ModelAndView对象中的模型数据渲染成视图,输出给浏览器。 以下是SpringMVC通过模型视图ModelAndView渲染视图的实现攻略:…

    Java 2023年6月15日
    00
  • eclipse连接数据库并实现用户注册登录功能

    首先需要明确的是,eclipse并不能直接连接数据库,需要借助一些工具和驱动才能实现。以下是连接数据库并实现用户注册登录功能的完整攻略: 环境准备 安装JDK、eclipse、MySQL数据库(或其他支持JDBC的数据库) 下载并安装MySQL JDBC驱动包(类似于mysql-connector-java.jar) 创建一个Java项目,设置好项目的cla…

    Java 2023年5月20日
    00
  • 基于json解析神器 jsonpath的使用说明

    下面是基于Json解析神器JsonPath的使用说明的详细攻略。 什么是JsonPath? JsonPath是一个基于Java的Json解析库,它可以用于解析Json数据并提取其中的内容。JsonPath使用类似XPath的查询语法,并支持大部分XPath表达式,同时还有一些自己的表达式。 如何使用JsonPath 步骤一:引入依赖 要使用JsonPath,…

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