首页 > 其他分享 >在springboot中使用拦截器+JWT验证token的流程

在springboot中使用拦截器+JWT验证token的流程

时间:2024-03-14 11:30:26浏览次数:19  
标签:拦截器 springboot JWT token import com public

我的计算机设计大赛的项目需要用到JWT来进行用户身份验证,项目采用springboot技术,因为我没学过springSrcurity所以只能用原生的拦截器+JWT技术进行验证,我是跟着【SpringBoot整合JWT】这篇文章做的,老师讲的很详细跟着一步一步来也可以实现JWT身份验证,但是对于验证过程的整个流程是不太清楚的,不知道代码是怎么运行完成验证的,后面自己debug和测试了下,在这里分享给大家!


stpe1:拦截器拦截http请求

首先使用spring提供的拦截器拦截前端发送的http请求,写一个配置类继承WebMvcConfigurer,实现里面的addInterceptors方法,在方法里调用InterceptorRegistry对象的addInterceptor方法提添加要拦截的url和放行的url 

/**
 * 拦截器,拦截/yangsheng路径下的所有请求进行token身份验证,但是放行/yangsheng/login
 */
@Configuration
public class InterceptConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加拦截器
        registry.addInterceptor(new JWTInterceptor())
                //拦截的路径 需要进行token验证的路径
                .addPathPatterns("/yangsheng/**")
                //放行的路径
                .excludePathPatterns("/yangsheng/user/login")
                .excludePathPatterns("/yangsheng/user/register");
    }
}

 step2:对请求头进行分析,并进行拦截

通过上述拦截器拦截下http请求后就要对请求头进行分析了,分析是否携带token,token是否过期,是否合法等等。

这里会用到一个我们自己写的JWTUtil工具类

package com.example.yangshengproject.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.Map;

/**
 * JWT工具类
 *
 * @author zhangzuhao
 * @version 1.0
 * @date 2023/5/18 21:28
 */

public class JWTUtil {
    /**
     * 密钥要自己保管好
     */
    private static String SECRET = "!Q@W#E$R";

    /**
     * 传入payload信息获取token
     * @param map payload
     * @return token
     */
    public static String getToken(Map<String, String> map) {
        JWTCreator.Builder builder = JWT.create();

        //payload
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });

        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.DATE, 1); //默认1天过期

        builder.withExpiresAt(instance.getTime());//指定令牌的过期时间
        return builder.sign(Algorithm.HMAC256(SECRET));
    }

    /**
     * 验证token 合法性
     */
    public static DecodedJWT verify(String token) {
        //如果有任何验证异常,此处都会抛出异常
        return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
    }

    /**
     * 获取token信息方法
     */
    public static Map<String, Claim> getTokenInfo(String token) {

        return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token).getClaims();
    }
}

   new一个JWTInterceptor类作为JWT拦截器,实现HandlerInterceptor,实现里面的preHandler方法,这个方法会返回一个boolean值如果为true就会执行下一拦截器直到没有拦截器可执行就进入业务代码,如果返回false会立马中这次请求务不往下执行。

  方法中通过request.getHeader("token")获取到请求头中token的信息,接着通过JWTUtil的verify方法进行验证如果没有抛异常说明验证通过,返回true,否则抛出异常try catch后返回false。

import com.auth0.jwt.interfaces.DecodedJWT;
import com.example.yangshengproject.utils.JWTUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.HashMap;
@Slf4j
public class JWTInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HashMap<String, String> map=new HashMap<>();
        //从http请求头获取token
        String token = request.getHeader("token");
        try {
            //如果验证成功放行请求
            DecodedJWT verify = JWTUtil.verify(token);
            return true;
        }
        catch (Exception exception)
        {
            map.put("msg","验证失败:"+exception);
        }
        String json = new ObjectMapper().writeValueAsString(map);
        response.setContentType("application/json:charset=UTF=8");
        response.getWriter().println(json);
        return false;
    }
}

标签:拦截器,springboot,JWT,token,import,com,public
From: https://blog.csdn.net/m0_73556978/article/details/136701750

相关文章

  • Springboot2+consul启动时报错,读取的SystemConfig类的值全部为null
    【错误描述】     解决方案:检查是否已经在pom.xml配置了consul的相关jar包引用。 排查过程:检查了启动的日志,跟旧项目的正常日志进行对比,发现缺少了读取配置boostrap文件的日志。怀疑没有启动consul服务去远端读取consul的内容。 ......
  • 从SpringBoot到DotNet_3.完成购物模块
    一、从购物车模型完成购物车(一)购物车模型设计​ 使用Guid作为购物车的主键,让EFCore自己管理外部引用,使用ICollection保存商品的信息,这里将商品抽象成LineItem与其他模块进行解耦。namespaceFakeXiecheng.Models;publicclassShoppingCart{[Key]publicGuid......
  • SpringBoot 中使用自定义参数解析器修改请求对象
    SpringBoot中使用自定义参数解析器修改请求对象在SpringBoot应用中,有时我们需要在控制器方法执行之前对请求对象进行修改。自定义参数解析器提供了一种灵活的方式来实现这一需求。1.创建自定义参数解析器首先,我们需要创建一个自定义参数解析器来处理对CommonRequest......
  • java毕业设计小众咖啡店推荐平台的设计与实现(springboot+mysql+jdk1.8+meven)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景在当今社会,咖啡已经成为许多人日常生活中不可或缺的一部分。随着人们生活水平的提高和消费观念的转变,越来越多的人开始追求个性化和高品质的咖啡体验。小......
  • java毕业设计线上教学平台(springboot+mysql+jdk1.8+meven)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景随着互联网技术的迅猛发展,线上教育已经成为了现代教学体系中不可或缺的一部分。尤其是在全球性的公共卫生事件影响下,线上教学平台显示出了其独特的优势和......
  • 使用Golong轻松实现JWT身份验证
    使用Golong轻松实现JWT身份验证JSON Web Tokens (JWT)是一种流行的安全方法,用于在两个方之间表示声明。在Web应用程序领域,它们通常用作从客户端向服务器传输身份信息(声明)的方式。本教程将引导您逐步实现Go应用程序中的JWT身份验证过程。什么是JWT?JSONWebToken(JWT......
  • Day40:安全开发-JavaEE应用&SpringBoot框架&JWT身份鉴权&打包部署JAR&WAR
    目录SpringBoot-身份鉴权-JWT技术SpringBoot-打包部署-JAR&WAR思维导图Java知识点功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方组件使用等.框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,反射机制待......
  • MyBatis拦截器执行流程!!!
    前提:将自定义的拦截器注入IOC容器。1、创建自定义拦截器,实现Interceptor接口,重写interceptor()方法2、在自定义拦截器上使用@Interceptors注解,在该注解中使用@Signature指定拦截的接口类型,方法名与参数类型。实例:/**Copyright(c)2020,2024,Allrightsreserved.......
  • 【Django进阶】djangorestframework-jwt使用
    【Django进阶】djangorestframework-jwt使用  简介Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者......
  • 【开源】SpringBoot框架开发人事管理系统
    目录一、摘要1.1项目介绍1.2项目录屏二、功能模块2.1管理员功能模块2.2普通员工功能模块2.3答辩文案三、系统展示四、核心代码4.1查询职称4.2新增留言回复4.3工资申请4.4工资审核4.5员工请假五、免责说明一、摘要1.1项目介绍基于JAVA+Vue+SpringBo......