当前位置:首页 > 技术分析 > 正文内容

Java,安全,JWT,jjwt,token应用案例

ruisui883个月前 (02-03)技术分析12

前言:

上一节,Java,安全,JWT,java-jwt,token应用案例,这里是另外一种实现jjwt组件的代码案例,主要包含创建token和解析token。

之前的相关内容:Java,SpringBoot采用token方式实现登录认证

代码案例:

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

创建Token和解析Token

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.*;

public class CreateAndSignTokenDemo {

    public static void main(String[] args) {
        String token = generalToken();
        System.out.println(token);
        // 输出:
        // eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VycyIsImlzcyI6IkZVUUktUEMiLCJleHAiOjE2MTM2Mzk4OTQsInVzZXJJZCI6IueUqOaIt0lEIiwiaWF0IjoxNjEzNjM5Mjk0LCJqdGkiOiI1YmEzZDUxYS1iYWNjLTQwOWUtOTNjMC04NTM3ZDFkMzAwMmEiLCJ1c2VybmFtZSI6IueUqOaIt-WQjeensCJ9.Y-Fzts0q1mjoGZW_LjRnnfFoutTZQenR1rIQ6cTEh3w
        Claims claims = parseToken(token);
        System.out.println(claims);
        //输出:
        //{sub=users, iss=auth0, exp=1613641143, userId=用户ID, iat=1613640543, jti=b9e415d1-425e-40b4-b62b-6d8240f46b6f, username=用户名称}
    }

    /**
     * 生成密钥
     *
     * @return
     */
    public static SecretKey generalKey() {
        String stringKey = "7786df7fc3a34e26a61c034d5ec8245d";
        byte[] encodedKey = Base64.getEncoder().encode(stringKey.getBytes());
        SecretKey secretKey = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return secretKey;
    }

    /**
     * @return
     */
    public static String generalToken() {
        try {
            // 设置签发算法
            SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
            // 生成密钥
            SecretKey key = generalKey();
            // 设置私有声明
            Map<String, Object> claims = new HashMap<>(16);
            claims.put("userId", "用户ID");
            claims.put("username", "用户名称");
            // 记录生成JWT的时间
            long nowMillis = System.currentTimeMillis();
            Date nowTime = new Date(nowMillis);
            // 设置过期时间 6分钟
            long expMillis = nowMillis + 10 * 60 * 1000;
            Date expTime = new Date(expMillis);
            // 创建tocken构建器实例
            JwtBuilder jwtBuilder = Jwts.builder()
                    // 设置自己的私有声明
                    .setClaims(claims)
                    // 设置该tocken的Id,用于防止tocken重复
                    .setId(UUID.randomUUID().toString())
                    // 设置签发者
                    .setIssuer("auth0")
                    // 设置签发时间
                    .setIssuedAt(nowTime)
                    // 设置过期时间
                    .setExpiration(expTime)
                    // 设置tocken的签发对象
                    .setSubject("users")
                    // 设置签发算法和密钥
                    .signWith(signatureAlgorithm, key);
            return jwtBuilder.compact();
        } catch (Exception e) {
            e.printStackTrace();
            return "生成tocken失败";
        }
    }

    /**
     * 解析tocken,从中提取出声明信息,里面包含用户信息
     *
     * @param tocken
     * @return
     */
    public static Claims parseToken(String tocken) {
        SecretKey key = generalKey();
        // 获取tocken中的声明部分
        Claims claims = Jwts.parser()
                .setSigningKey(key)
                .parseClaimsJws(tocken).getBody();
        return claims;
    }

}

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/756.html

标签: spec.ts
分享给朋友:

“Java,安全,JWT,jjwt,token应用案例” 的相关文章

Vue组件通信之props深入详解!

props 是 Vue 组件中一个很重要的概念。它是用来从父组件向子组件传递数据的。为什么需要props?这是因为在Vue中,组件是相互隔离的。每个组件都有自己的作用域,子组件无法直接访问父组件的状态或值。通过props,父组件可以将数据传递给子组件。使用props的步骤:1. 在子组件中定义pro...

Git分布式系统---Gitlab多人工作流程

前言在上一次推文中,我们已经很清楚的讲解了如何创建本地仓库、提交(push)项目到远程仓库以及从远程仓库clone(克隆)项目到本地的相关操作。大家可以先去看前面的推文(快速掌握Git分布式系统操作)点击查看目前无论你是否步入社会还是在校学生,都会使用Gitlab来进行团队的代码管理。(可以这样说:...

gitlab简单搭建与应用

一、gitlab1、简介GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。与Github类似,GitLab能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历...

虚幻引擎5.5现已发布 手游开发、动画制作重大改进

Epic在今天发布了虚幻引擎5.5,现可通过Epic Launcher下载。此版本在动画创作、渲染、虚拟制片、移动端游戏开发和开发人员迭代工具集等方面做出了重大改进。 官方博客:虚幻引擎5.5现已发布,在动画创作、虚拟制作和移动游戏开发方面取得了显著进步,渲染、摄像机内视觉特效和开发人员迭代等领域的...

Python中的11 种数组算法

1. 创建数组 创建数组意味着留出一个连续的内存块来存储相同类型的元素。在大多数语言中,您可以在创建数组时指定数组的大小。假设您正在书架上整理一组书籍,并且您需要为正好 10 本书预留空间。功能架上的每个空间都对应于数组中的一个索引。# Example in Python arr = [1, 2,...

12种JavaScript中最常用的数组操作整理汇总

数组是最常见的数据结构之一,我们需要绝对自信地使用它。在这里,我将列出 JavaScript 中最重要的几个数组常用操作片段,包括数组长度、替换元素、去重以及许多其他内容。1、数组长度大多数人都知道可以像这样得到数组的长度:const arr = [1, 2, 3]; console.log(a...