登录-07.JWT令牌-登录后下发令牌

news/2025/2/24 13:39:48

一.思路

我们首先完成令牌生成。

在响应数据这一块

 

该响应数据是一个标准的Result结构,其中"data"的值就是一个JWT令牌。因此我们只需要将生成的JWT令牌封装在Result当中然后返回给前端即可。

备注是给前端看的,不用管。以后我们做校验时,只需要从前端的header中拿到名称为token的值,然后进行校验即可。

二.步骤

java">package com.gjw.util;

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 = "handsomegaojiaweilovesbeautifulmengxinruloveforever";
    private static Long expire = 4300000L;

    /**
     * 生成Jwt令牌
     */
    public static String generateJwt(Map<String,Object> claims) {


        String jwt = Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + expire) )
                .compact();
        return jwt;
    }

    /**
     * 解析Jwt令牌
     */
    public static Claims parseJWT(String jwt){
        Claims claims = Jwts.parserBuilder()
                .setSigningKey(signKey)
                .build()
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}

我们设置过期时间为4300000毫秒。并将JWT令牌工具类引入登录的controller方法。

java">package com.gjw.controller;

import com.gjw.pojo.Emp;
import com.gjw.pojo.Result;
import com.gjw.service.EmpService;
import com.gjw.util.JwtUtils;
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 result(@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.getUsername());

            String jwt = JwtUtils.generateJwt(claims);
            return Result.success(jwt);
        }
        //登录失败, 返回错误信息
        return Result.error("用户名或密码错误!");
    }
}

首先判断登录用户是否存在,如果不存在,那么就登录失败,返回错误信息。如果找到用户,那么就将该用户的id,name,username的键值对作为claims数据集成到令牌当中,并返回生成的JWT令牌到controller层中。然后将生成的JWT令牌通过Result返回给前端。

登录后我们可以通过查看浏览器的开发者工具中的Response进行JWT令牌的查看

JWT令牌在浏览器的Local Storage中存储。

而当前端再次发起请求时,会将生成的JWT令牌携带过来。


http://www.niftyadmin.cn/n/5864398.html

相关文章

便携式动平衡仪Qt应用层详细设计方案(基于Qt Widgets)

便携式动平衡仪Qt应用层详细设计方案&#xff08;基于Qt Widgets&#xff09; 版本&#xff1a;1.0 日期&#xff1a;2023年10月 一、系统概述 1.1 功能需求 开机流程&#xff1a;长按电源键启动&#xff0c;全屏显示商标动画&#xff08;快闪3~4次&#xff09;。主界面&…

NavVis VLX三维扫描:高层建筑数字化的革新力量【沪敖3D】

在三维激光扫描领域&#xff0c;楼梯结构因其复杂的空间形态和连续垂直移动的实际需求&#xff0c;一直是技术难点之一。利用NavVis VLX穿戴式移动扫描系统成功完成一栋34层建筑的高效扫描&#xff0c;其中楼梯部分的数据一遍成形且无任何分层或形变。本文将深入分析该项目的技…

python读取sqlite温度数据,并画出折线图

需求&#xff1a; 在Windows下请用python画出折线图&#xff0c;x轴是时间&#xff0c;y轴是温度temperature 和体感温度feels_like_temperature 。可以选择县市近1小时&#xff0c;近1天&#xff0c;近1个月的。sqlite文件weather_data.db当前目录下&#xff0c;建表结构如下…

【ubuntu24.04】pycharm安装pygraphviz

pip install pygraphviz 安装失败 (05_ep_dev) root@k8s-master-pfsrv:/home/zhangbin/perfwork/01_ai/05_ep_dev/expert/src/test/sumory# pip install pygraphviz Collecting pygraphviz Downloading pygraphviz-1.14.tar.gz (106 kB) Installing build dependencies … don…

网络传输的七层协议

网络传输的七层协议是 OSI模型&#xff08;开放系统互联模型&#xff09; 中的七个层次&#xff0c;每一层都负责不同的网络功能。具体如下&#xff1a; 物理层&#xff08;Physical Layer&#xff09; 负责在物理媒介上传输比特流&#xff0c;即将数据以电信号、光信号等形式在…

【框架】参考 Spring Security 安全框架设计出,轻量化高可扩展的身份认证与授权架构

关键字&#xff1a;AOP、JWT、自定义注解、责任链模式 一、Spring Security Spring Security 想必大家并不陌生&#xff0c;是 Spring 家族里的一个安全框架&#xff0c;特别完善&#xff0c;但学习成本比较大&#xff0c;不少开发者都觉得&#xff0c;这个框架“很重” 他的…

机器学习数学通关指南——牛顿-莱布尼茨公式

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一句话总结 ∫ a b f ( x ) …

【并发编程】线程池任务抛异常会怎么样?

一、先说结论 得看线程池的实现&#xff0c;JUC 的线程池&#xff08;ThreadPoolExecutor&#xff09;的话 不会影响其他的线程若是 submit 方法&#xff0c;或者任务为 future 任务&#xff0c;异常只有在 get 的时候才会抛出若是 execute runnable 任务&#xff0c;异常就…