首页 > 其他分享 >jwt令牌生成和解析 + 几种数据获取方法

jwt令牌生成和解析 + 几种数据获取方法

时间:2024-07-26 21:07:46浏览次数:11  
标签:令牌 String 登录 jwt claims import 解析

——————jwt令牌生成和解析

jdk:17

spring boot:3.x

 

JwtUtils.java

其中 String singKey 这一部分不要太短,不然会报错

package com.example.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 singKey = "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXD";      //签名密钥
    private static Long expire = 43200000L;         //有效期

    /*
    生成令牌
     */
    public static String generateJwt(Map<String, Object> claims){
        String jwt = Jwts.builder()
                .addClaims(claims)      //自定义内容(载荷部分)
                .signWith(SignatureAlgorithm.HS256, singKey)      //设置签名算法
                .setExpiration(new Date(System.currentTimeMillis() + expire))        //有效期
                .compact();
        return jwt;
    }

    /*
    解析(校验)令牌
     */
    public static Claims parseJWT(String jwt){
        Claims claims = Jwts.parser()
                .setSigningKey(singKey)
                .parseClaimsJws(jwt)
                .getBody();     //获得自定义部分内容
        return claims;
    }

}

 

使用案例

登录

package com.example.controller;

import com.example.pojo.Emp;
import com.example.pojo.Result;
import com.example.service.EmpService;
import com.example.utils.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 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.getUsername());

            //让jwt中包含当前登录的员工信息
            String jwt = JwtUtils.generateJwt(claims);
            return Result.success(jwt);
        }
        //登录失败,返回错误信息
        return Result.error("用户名或密码错误");
    }
}

 

解析令牌

package com.example.filter;

import com.alibaba.fastjson.JSONObject;
import com.example.pojo.Result;
import com.example.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.io.IOException;

@Slf4j
//@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
    /*
    ServletRequest servletRequest:获取请求参数
    ServletResponse servletResponse:响应结果
    FilterChain filterChain:执行放行操作
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //1.获取请求url
        String url = request.getRequestURI().toString();
        log.info("请求是url:{}",url);
        //2.判断请求url中是否包含login,如果包含说明是登录操作,放行
        if (url.contains("login")){
            log.info("登录操作,放行……");
            filterChain.doFilter(request,response);
            return;
        }
        //3.获取请求头中的令牌token
        String jwt = request.getHeader("token");
        //4.判断令牌是否存在,如果不存在返回错误结果(未登录)
            //StringUtils.hasLength用于判断字符串是否有长度
        if (!StringUtils.hasLength(jwt)){
            log.info("请求头token为空,返回未登录的信息");
            Result error = Result.error("NOT_LOGIN");
            //手动转换,调用fastJSON将error转换为接送
            String notLogin = JSONObject.toJSONString(error);
            //将未登录结果响应给浏览器
            response.getWriter().write(notLogin);
            return;
        }
        //5.解析token,如果解析失败返回错误结果(未登录)
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            //jwt令牌解析失败
            e.printStackTrace();
            log.info("解析令牌失败,返回未登录的信息");
            Result error = Result.error("NOT_LOGIN");
            //手动转换,调用fastJSON将error转换为接送
            String notLogin = JSONObject.toJSONString(error);
            //将未登录结果响应给浏览器
            response.getWriter().write(notLogin);
            return;
        }
        //6.放行
        log.info("令牌合法,放行");
        filterChain.doFilter(request,response);
    }
}

 

——————————————————

几种数据获取方法

//操作人的id - 当前登录员工的id
        //获取请求头中的jwt令牌并解析即可
        String jwt = request.getHeader("token");
        Claims claims = JwtUtils.parseJWT(jwt);
        Integer operateUser = (Integer) claims.get("id");       //此时拿到了当前登录员工的id
        //操作类名
        //joinPoint.getTarget() 拿到目标对象
        //joinPoint.getTarget().getClass()  拿到类对象
        //joinPoint.getTarget().getClass().getName()    拿到目标类类名
        String className = joinPoint.getTarget().getClass().getName();
        //操作方法名
        //joinPoint.getSignature()  获得方法签名
        String methodName = joinPoint.getSignature().getName();
        //操作方法参数
        Object[] args = joinPoint.getArgs();
        String methodParams = Arrays.toString(args);
        //方法返回值
        String returnValue = JSONObject.toJSONString(result);

 

标签:令牌,String,登录,jwt,claims,import,解析
From: https://www.cnblogs.com/yansans/p/18326243

相关文章

  • Android开发 - 滑动条监听进度setOnSeekBarChangeListener方法解析
    setOnSeekBarChangeListener方法的参数是一个SeekBar.OnSeekBarChangeListener类型的对象,该对象中包含了三个方法:onProgressChanged(SeekBarseekBar,intprogress,booleanfromUser):当SeekBar的进度发生变化时就会调用这个方法。在这个方法中,我们可以获取SeekBar滑动条的当......
  • Android开发 - 存储辅助类 SharedPreferences 解析
    SharedPreferences简介SharedPreferences是Android平台上一个轻量级的存储辅助类,用来保存应用的一些常用配置。SharedPreferences的数据以键值对(key,val)的进行保存在以xml形式的文件中。在应用中通常做一些简单数据的持久化缓存从editor的put方法可以看出SharedPreferenc......
  • 表面贴装差分输出晶体振荡器 DSO533SK/DSO533SJ 全面解析
    表面贴装差分输出晶体振荡器DSO533SK/DSO533SJ全面解析摘要:本文深入探讨表面贴装差分输出晶体振荡器DSO533SK/DSO533SJ的特性、工作原理、优势、应用领域以及使用中的关键要点。通过详细的阐述和实例分析,为读者提供全面且深入的技术解读。一、引言在当今高度集成和高......
  • 用Python解析邮件日志
    我的任务有点困难。我有一个邮件日志,如:Oct315:30:18mail1postfix/lmtp[5369]:DB10242054:to=<XXXXX>,orig_to=<XXXXXX>,relay=ip[ip]:port,delay=1.4,delays=0.04/0/0.01/1.4,dsn=2.0.0,status=sent(2502.0.0fromMTA(smtp:[iP]:port):2502.0.0Ok:queueda......
  • CET6英语六级真题及答案解析下载电子版pdf2024年6月
    大学英语六级真题在线试卷电子版PDF听力及答案解析–学习备忘录(201800.com)2024年6月CET6真题及答案解析,扫码下载电子版PDF:李明,是一名即将大三的学生。他一直梦想着能够顺利通过大学英语六级考试(CET-6),因为他知道这不仅能够证明自己的英语水平,还可能为将来的就业或留学提供......
  • AI大模型的革命:解析全球主流AI大模型及其对比分析
    在人工智能领域,AI大模型的发展正在改变我们的世界。无论是自然语言处理、图像识别,还是自动驾驶和医疗诊断,AI大模型都展示出其强大的潜力和广泛的应用前景。本文将介绍当前世界上主流的AI大模型,并对各个模型做详细介绍和横向对比,深入探讨这些模型的特点、优势以及应用领域。......
  • Redis缓存面试问题解析:如何有效管理缓存失效策略?
    在技术面试中,Redis缓存是一个常见的话题。面试官往往会考察候选人对缓存机制的理解以及在实际场景中的应用能力。本文将探讨一个在Redis缓存面试中经常被问到的问题,并深入解析其背后的概念和解决方案。面试问题:如何管理Redis缓存的失效策略?问题描述:在高并发的web应用中,缓存是提......
  • OSPF实验解析
    一·、实验拓扑图及实验需求1、实验拓扑图:2、实验需求:整个网络使用192.168.1.0/24,进行地址分配Area0域中,R1为DR,R2为BDRR3与R4之间使用密文认证,密码为[email protected]、R2、R5上各自配置一一个环回接口。R1和R2的环回接口可以宣告到0SPF网络设备的RID为每台设备的名称......
  • OutputParserException:无法解析 Jupyter Notebook 上的 LLM 输出
    我在conda笔记本上遇到以下错误File~\.conda\envs\LLMS\lib\site-packages\langchain\agents\conversational\output_parser.py:26,inConvoOutputParser.parse(self,text)24match=re.search(regex,text)25ifnotmatch:--->26raiseOutputParserE......
  • 试图找出此页面的逻辑:存储了大约 ++ 100 个结果 - 并使用 Python 和 BS4 进行了解析
    试图找出此页面背后的逻辑:我们已将一些结果存储在以下数据库中:https://www.raiffeisen.ch/rch/de/ueber-uns/raiffeisen-gruppe/Organization/raiffeisenbanken/deutsche-schweiz.html#accordionitem_18104049731620873397从a到z大约:120个结果或更多:......