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

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

ruisui884个月前 (02-03)技术分析19

前言:

上一节,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应用案例” 的相关文章

Linux发行版Debian推出12.2及11.8版本,修复多个安全问题

IT之家 10 月 9 日消息,Debian 是最古老的 GNU / Linux 发行版之一,也是许多其他基于 Linux 的操作系统的基础,包括 Ubuntu、Kali、MX 和树莓派 OS 等,近日 Debian 推出了 12.2 和 11.8 版本,主要修复了多个安全问题。▲ 图源 Debia...

vue中如何在自定义组件上使用v-model和.sync

自定义事件tips推荐始终使用 kebab-case 的事件名。(v-on会将事件名自动转换为小写,避免匹配不到)changeData ×change-data √自定义组件的v-model用法:父组件定义数据源(不需要定义修改数据的方法),在子组件标签上通过v-model="data...

2021最全VUE面试题,奥利给

1. vue-router用过没,哪些常用的钩子函数路由钩子的执行流程,钩子函数种类有:全局守卫、路由守卫、组件守卫。首页可以控制导航跳转, beforeEach , afterEach 等,?般?于页? title 的修改。?些需要登录才能调整??的重定向功能。beforeEach 主要有3个参数...

掌握版本控制:Git的那些常见用法与技巧

Git作为现代开发中最常用的版本控制系统,它的普及和高效性使得程序员几乎每天都在与它打交道。无论是个人项目,还是团队协作,Git都能帮助我们追踪代码的修改历史,保证代码版本的管理井井有条,并在多人协作时有效地避免冲突。本文将分享一些常见的Git用法与技巧,帮助你更好地掌握Git的强大功能,并提升你在...

GitLab 14.6发布,优化Geo高可用,安全更新等

昨天,GitLab官方按照管理发布了有一个月度版本GitLab 14.6的发布,这也是本年度收官版本。14.6中在安全合规性方面,在Geo方面以及MD代码块一键复制等方便做了优化,另外还在UI图标方面发布了一套全新的图标。详细情况请和虫虫一起学习。GitLab 14.6主要改进使用 Geo 实现无缝...

HTML5学习笔记三:HTML5语法规则

1.标签要小写2.属性值可加可不加””或”3.可以省略某些标签 html body head tbody4.可以省略某些结束标签 tr td li例:显示效果:5.单标签不用加结束标签img input6.废除的标签font center big7.新添加的标签将在下一HTML5学习笔记中重点阐述。...