SpringBoot-JWT生成

news2025/2/25 13:51:46

 一、理论

1.配置pom.xml

<!--        JWT令牌-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

2.加密方式

 说明:官网JSON Web Tokens - jwt.io

3. 测试类

说明:使用Jwts.builder()方法创建一个JWT实例,设置签名算法为HS256,自定义内容(载荷)为一个包含id和name属性的Map对象,设置有效期为一个小时(3600秒),最后通过compact()方法生成JWT字符串并输出。

//    测试jwt生成
    @Test
    public void testGenJWT(){

        Map<String, Object> claims=new HashMap<>();
        claims.put("id",1);
        claims.put("name","tom");
        String jwt=Jwts.builder()
                .signWith(SignatureAlgorithm.HS256,"forever") //设置签名算法
                .setClaims(claims) //自定义内容(载荷)
                .setExpiration(new Date(System.currentTimeMillis()+3600*1000)) //设置有效期为一个小时
                .compact();
        System.out.println(jwt);
    }
}

4. 官网解码

5.解码方法

说明:使用Jwts.parser()方法创建一个JWT解析器实例,指定签名秘钥为"forever",然后调用parseClaimsJws()方法解析JWT字符串,最后获取解析出的Claims对象并输出。

    //JWT解析
    @Test
    public void testParseJwt() {
        Claims claims = Jwts.parser()
                .setSigningKey("forever")  //指定签名秘钥
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY5NTE5MzIxM30.EZ3aIpgt3-FRu0BI3F2ZjVm2yLvF7wHQmFV2KhC5nIc") //解析令牌
                .getBody();
        System.out.println(claims);
    }
}

二、实战

1. JwtUtils类

说明:书写JwtUtils类

package com.itheima.controller.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;

public class JwtUtils {

    private static String signKey = "forever";
    private static Long expire = 43200000L;

    /**
     * 生成JWT令牌
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @return
     */
    public static String generateJwt(Map<String, Object> claims){
        String jwt = Jwts.builder()
                .addClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    /**
     * 解析JWT令牌
     * @param jwt JWT令牌
     * @return JWT第二部分负载 payload 中存储的内容
     */
    public static Claims parseJWT(String jwt){
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}

2.LoginController

说明:登录控制类

package com.itheima.controller;

import com.itheima.controller.utils.JwtUtils;
import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController

public class LoginController {
    @Autowired
    private EmpService empService;

    @PostMapping("/login")
    public Result login(@RequestBody Emp emp) {
        log.info("员工登录:{}", emp);
        Emp e = empService.login(emp);
//      如果登录成功,生成令牌,下发令牌
        if (e != null) {
            Map<String, Object> claims = new HashMap<>();
            claims.put("id", e.getId());
            claims.put("name", e.getName());
            claims.put("username", e.getName());
            String jwt = JwtUtils.generateJwt(claims);  //包含员工登录的信息
            return Result.success(jwt);
        }
//        登录失败,返回错误信息
        return Result.error("用户名或者密码错误");
    }
}

3.测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1027602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vim的使用介绍以及命令大全(系统性学习day3)

懒羊羊感谢大家的关注和三连支持~ 目录 前言 一、vim的使用介绍 二、命令大全 1.命令模式 &#xff08;1&#xff09;复制&#xff08;配合粘贴命令p使用&#xff09; &#xff08;2&#xff09;剪切 &#xff08;3&#xff09;粘贴 &#xff08;4&#xff09;删除 …

IDM激活

激活脚本原地址 github搜索&#xff1a;IDM-Activation-Script 或者直接点我进入 如何激活&#xff1f; 下载IDM 官网链接&#xff1a;Internet Download Manager: The fastest download accelerator 然后安装 安装成功后进入powershell win x 执行命令 iwr -useb https:/…

企业蓄电池怎么实时监测?这个方法最简单使用!

在这个数字时代&#xff0c;企业对电力的依赖性愈发显著&#xff0c;这使得电池系统成为维持业务连续性的不可或缺的一环。 蓄电池监控不仅有助于实时跟踪电池系统的性能和状态&#xff0c;还有助于预测问题&#xff0c;提前采取措施以防止电力中断。它还可以帮助企业降低能源成…

2023年9月21日,历史上的今天大事件早读

​公元前19年9月21日古罗马诗人维吉尔逝世 1069年9月21日宋神宗采用王安石新法&#xff0c;开始实行青苗法 1643年9月21日皇太极逝世 1898年9月21日慈禧太后发动戊戌政变 1909年9月21日我国飞机设计师冯如第一次试飞成功 1920年9月21日民主革命家朱执信遇难 1926年9月21日…

c++ 函数的参数是否可以为auto

&#xff08;1&#xff09;在vs2019开到 cpp20 的语法规范&#xff0c;是可以的 &#xff08;2&#xff09;但网上和文心一言和书上说不可以 (2) 再附上一种auto 的很炫酷的写法&#xff1a;

面试Java后端

sql 五表联合查询 面试八股 JDK&#xff0c;JRE,JVM之间的区别 JDK&#xff0c;Java标准开发包&#xff0c;它提供了编译、运行Java程序所需的各种工具和资源&#xff0c;包括Java编译器、Java运行时环境&#xff0c;以及常用的Java类库等。 JRE(Java Runtime Environment)&…

label_studio中uwsgi内存占用高的问题排查

问题描述 使用docker起的label_studio服务&#xff0c;起来就占了8GB内存&#xff0c;无论是否有标注任务。 而且这个么大内存label_studio起来就有&#xff0c;不是随着时间起来的。本来发现问题的是label_stuido17.3, 我下载了18.02版本的docker&#xff0c;问题也是一样的,…

视频监控系统/安防监控/视频AI智能分析网关:持刀检测算法场景汇总

TSINGSEE青犀AI智能分析网关——持刀检测算法&#xff0c;是一种利用计算机AI分析算法技术来检测和辨别视频中是否存在刀具的算法&#xff0c;用来保障群众安全&#xff0c;维护公共治安&#xff0c;还可以与“人员跌倒”、“人员聚集”、“人员跌倒”等算法结合&#xff0c;制…

inpaint-anything:分割任何东西遇到图像修复

用户可以通过单击图像中的任何对象来选择它。借助强大的视觉模型&#xff0c;例如SAM&#xff0c;LaMa和稳定扩散&#xff08;SD&#xff09;&#xff0c;Inpaint Anything能够顺利地删除对象&#xff08;即删除任何内容&#xff09;。 此外&#xff0c;在用户输入文本的提示下…

JUnit测试进阶(Mock测试)

Mock测试 一、Mock测试1.Mock测试产生背景2.什么是Mock测试3.具体案例 一、Mock测试 1.Mock测试产生背景 一个应用程序通常由多个类文件组成&#xff0c;各个类之间彼此存在着继承&#xff0c;实现&#xff0c;关联&#xff0c;依赖等关系&#xff0c;共同为用户服务。应用中单…

vue部分/所有内容全屏切换展示

需求&#xff1a;就是把一个页面的某一部分内容点击全屏操作按钮后全屏展示&#xff0c;并非所有内容全屏&#xff0c;所有内容的话那肯定就所有全屏展示啊&#xff0c;可以做切换 1.部分全屏代码 element.requestFullscreen();这个就是全屏的代码了&#xff0c;注意前面的ele…

学习如何编码

在学习编码时感受到一些失败 ● 他在编码旅途之初并没有一个明确的目标&#xff1b; ● 他从看课程和阅读教程开始&#xff0c;但他只会复制代码&#xff0c;而不关心它是如何工作的。有时候他会复制粘贴代码 ● 他没有通过做小挑战或记笔记来强化他正在学习的东西 ● 他没有练…

springboot整合全局异常处理

一、项目结构 二、全局异常 &#xff08;1&#xff09;启动类 package com.mgx;import com.mgx.common.dto.Result; import com.mgx.utils.ErrorUtil; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.spr…

GLIP:将语言图像预训练引入目标检测

本文将深入研究一篇论文,该论文以CLIP在语言图像预训练方面的巨大成功为基础,并将其扩展到目标检测任务:GLIP — G圆形语言图像预训练。我们将涵盖论文的关键概念和发现,并通过提供进一步的上下文以及为图像和实验结果添加注释来使它们易于理解。我们走吧!

sublime text3 设置代码错误提示之php

第一步&#xff1a; ctrlshiftp 输入 install package 并选中 第二步&#xff1a; 输入 sublimelinter-php 第三步&#xff1a; Prefernces> package Settings >Sublimelinter > settings 这里不同按照版本可能不一样 有些可能是 settings User 第四步 完成

element show-overflow-tooltip 复制

el-table-column的show-overflow-tooltip弹出的提示无法复制&#xff0c;官方也暂时不准备解决&#xff0c;可以自己模拟一个 <el-table-column label"支付单号" width"100"><template #default"{ row }"><el-tooltip :content&…

正则表达式新解

文章目录 是什么&#xff1f;正则用法匹配单个字符匹配一组字符其他元字符核心函数 贪婪匹配和非贪婪匹配正则练习 是什么&#xff1f; 正则表达式(Regular Expression)是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊…

华为OD机试 - 矩形相交的面积 - 逻辑分析(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入&#xff1a;2、输出&#xff1a;3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff0…

文本文件中回车及空格字符的删除(自用)

问题&#xff1a;notepad显示正常但是&#xff0c;其他文本文件打开发现数据之间有空格 解决步骤&#xff1a; [1] 把符号都显示出来 [2] 删除字符 [2-1]CR LF ----- \r\n [2-2]还有一种就是箭头&#xff0c;也会呈现 同样用替换的方法处理