springboot登录校验[JWT]

news2025/1/18 9:10:26

前言
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:后端专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

在这里插入图片描述

目录

  • 一、初识登录校验
  • 二、Jwt令牌
  • 三、JWT的生成
  • 四、统一校验【filter过滤器方式】
  • 五、统一校验【interceputer拦截器器方式】
  • 题外篇【springboot新手开发起步】

一、初识登录校验

啥是登录校验?

  • 所谓登录校验,指的是我们在服务器端接收到浏览器发送过来的请求之后,首先我们要对请求进行校验。先要校验一下用户登录了没有,如果用户已经登录了,就直接执行对应的业务操作就可以了;如果用户没有登录,此时就不允许他执行相关的业务操作,直接给前端响应一个错误的结果,最终跳转到登录页面,要求他登录成功之后,再来访问对应的数据

常见的登录校验

在这里插入图片描述

分布式之session共享问题 4种解决方案及spring session的使用
这里推荐 做时间的朋友。的一篇文章点此跳转
https://blog.csdn.net/weixin_44335140/article/details/112994824

二、Jwt令牌

  • 全称:JSON Web Token (https:/ /jwt.io/ )
  • 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。

组成
在这里插入图片描述

  • 第一部分:Header(头),记录令牌类型、签名算法等。例如:{“alg”:“HS256”, “type” :“JIWT”)
  • 第二部分: Payload(有效载荷),携带一些自定义信息、默认信息等。例如:{“id”.“1”,“username”:“Tom”}
  • 第三部分: Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。
    在这里插入图片描述

JWT的登录场景
在这里插入图片描述
右上面可知我们就需要实现生成jwt令牌和实现一个统一拦截 校验

三、JWT的生成

一、引入依赖


<!--        引入jwt依赖-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>

然后就能使用提供的 Jwts工具类了


二、生成JWT

  • signWith()签名算法和密钥
  • setClaims()存储自定义的数据(载荷)
  • setExpiration()有效期
 String JWTString = Jwts.builder()//生成jwt令牌
                .signWith(SignatureAlgorithm.HS256, "xbfinal")// 签名算法和密钥
                .setClaims(hashMap)//存储自定义的数据(载荷)
                //System.currentTimeMillis()获取当前时间毫秒值 一下表示当前时间后的一个小时
                .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//有效期  1小时
                .compact();
        System.out.println(JWTString);

在这里插入图片描述
三、JWT令牌的解析

  • setSigningKey() 签名密钥
  • parseClaimsJws()传入生成的 jwt令牌
  • getBody()拿到我们自定义的内容
 Claims keyBody = Jwts.parser()
                .setSigningKey("xbfinal")//签名密钥
                //传入生成的 jwt令牌
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi56yR6Zy4ZmluYWwiLCJleHAiOjE2ODEzNTQxMTcsImFnZSI6IjE4In0.77CDL0t1yFGDeXvM9pH5TKT1Pt5Xq6rUdycl4yPCC6Q")
                .getBody();//拿到我们自定义的内容

        Map<String, Object> stringObjectMap = BeanUtil.beanToMap(keyBody);
        System.out.println(stringObjectMap.get("name"));
        System.out.println(keyBody);

在这里插入图片描述

四、统一校验【filter过滤器方式】

@Slf4j
@WebFilter(urlPatterns = "/*")  //别忘了   启动类加上@ServletComponentScan注解
public class LoginCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        //获取请求url
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse res = (HttpServletResponse) servletResponse;

        String requestURL = req.getRequestURL().toString();
        log.info("请求地址{}",requestURL);

        //判断是不是登录请求?是的话就放行
        if(requestURL.contains("doLogin")){
            log.info("登录放行");
            filterChain.doFilter(servletRequest,servletResponse);
            return;//返回的时候直接返回 不执行下面的代码
        }

        //获取请求头中的token
        String jwt = req.getHeader("JWTStr");
        //验证令牌
        if(StrUtil.isEmpty(jwt)){
            //不存在
            log.info("token为空");

            String jsonStr = JSONUtil.toJsonStr(SaResult.error("没有登录").toString());
            res.getWriter().write(jsonStr);
            return;
        }
        try{
            Claims parser = MyJwtUtils.parser(jwt);

        }catch (Exception e){
            log.info("token为空");
              String jsonStr = JSONUtil.toJsonStr(SaResult.error("没有登录").toString());
            response.getWriter().write(jsonStr);
            return;
        }

        //放行
        filterChain.doFilter(servletRequest,servletResponse);



    }
}

注意 :需要前端把jwt放入请求头中

五、统一校验【interceputer拦截器器方式】

  • 先编写拦截器类并实现HandlerInterceptor 接口
  • 注册拦截器WebMvcConfigurer
@Slf4j
@Component //拦截器配置好后别忘了注册
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //获取请求头中的token
        String jwt = request.getHeader("satoken");
        //验证令牌
        if(StrUtil.isEmpty(jwt)){
            //不存在
            log.info("token为空");
            String jsonStr = JSONUtil.toJsonStr(SaResult.error("没有登录").toString());
            response.getWriter().write(jsonStr);
            return false;
        }
        try{

            Claims parser = MyJwtUtils.parser(jwt);

        }catch (Exception e){
            log.info("token为空");
            String jsonStr = JSONUtil.toJsonStr(SaResult.error("没有登录").toString());
            response.getWriter().write(jsonStr);
            return false;
        }

        //放行
        log.info("登录放行");
        return true;
    }

注册拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    LoginCheckInterceptor loginCheckInterceptor;

    /**
     * 注册拦截器的方法
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginCheckInterceptor)
                .addPathPatterns("/**")//拦截所以资源
                .excludePathPatterns("/user/doLogin/**")//排除路径
//                .order(1) 有多个拦截器的话设置优先级 数字越小优先级越高
        ;
        
    }
}

注意 :需要前端把jwt放入请求头中

题外篇【springboot新手开发起步】

在这里插入图片描述
链接我的另一篇博客

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

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

相关文章

Spring Transaction 源码解读

Spring Transaction 规范的maven坐标如下&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>...</version></dependency>该包提供了spring事务规范和默认的jta(ja…

【SSM】SSM整合步骤和流程细化

整合SSM参考文献一、SSM整合前概述1. 各个框架在三层架构模式中所担任的角色2. 两个IOC容器的创建1&#xff09;整合时Spring中IOC容器的创建时间2&#xff09;Spring提供的监听器&#xff08;ContextLoaderListener&#xff09;二、SSM整合步骤参考文献 卤蛋的SSM整合完整流程…

华为nat配置实验:内网能够访问外网,内网服务器80端口映射出去

一 需求分析1.1 需求公司A在北京&#xff0c;公司B在上海&#xff0c;本次实验仅仅模拟局域网内出口路由器的配置&#xff0c;公司A业务流量较大&#xff0c;并且预算有限。公司B模拟外网的一个小型局域网&#xff0c;要求公司B的主机能够访问公司A的web服务器。1.2 分析采用na…

Linux中滴计划任务

计划任务计划任务计划任务分类at命令load averagecrontab命令配置文件通常包含三个部分cron服务配置文件cron服务的日志文件时间数值的特殊表示方法应用实例案例anacron服务计划任务 计划任务&#xff08;Cron Job&#xff09;是指在预定的时间自动执行一些指定的任务或脚本。…

Pytorch使用预训练好的卷积神经网络进行推理预测

本小节将会介绍如何利用已经预训练好的卷积神经网络模型对一张图像进行预测&#xff0c;并且通过可视化的方法&#xff0c;查看模型是如何得到其预测结果的。 我们直接看一个实例&#xff0c;利用已经预训练好的VGG16卷积神经网络对一张图像获取一些特定层的输出&#xff0c;并…

通过python理解光的偏振

文章目录基本原理椭圆偏振光基本原理 光是横波&#xff0c;可以写成E⃗A⃗cos(ωt−k⃗r⃗)\vec E \vec{A}cos(\omega t-\vec k\vec r)EAcos(ωt−kr)&#xff0c;振动方向与传播方向垂直&#xff0c;而在三维空间中&#xff0c;与光线垂直的乃是法平面。换言之&#xff0c;光…

【Minecraft开服】Windows搭建我的世界MC服务器「公网远程联机」

文章目录1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址9. 使用固定公网地址远程联机简单…

【计算机网络-网络层】IPv4 和 IPv6

文章目录第一部分&#xff1a;IPv4&#xff08;IP 协议版本 4&#xff09;1 IP 数据报1.1 IP 数据报格式1.2 相关例题2 分类编址&#xff08;两级结构&#xff0c;网络号定长&#xff09;2.1 IP 地址的表示方法2.2 IP 分类编址2.3 IP 地址的特殊用途3 无分类编址 CIDR&#xff…

PyTorch 之 神经网络 Mnist 分类任务

文章目录一、Mnist 分类任务简介二、Mnist 数据集的读取三、 Mnist 分类任务实现1. 标签和简单网络架构2. 具体代码实现四、使用 TensorDataset 和 DataLoader 简化本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 一、Mnist 分类任…

recyclerview中树状结构的实现,加载本地中文件夹信息

引文&#xff1a; 在项目实现中&#xff0c;对于树状图结构的分析一直无法实现正确的效果&#xff0c;结果查看别人的项目都不要适合我的应用场景&#xff0c;但是查看其实原理是差不多的&#xff0c;但是我没有看明白&#xff0c;所以一直在看这方面的东西。查阅并修改他人的代…

ADSP21489之CCES开发笔记(九)

21489评估板调试SigmaStudio&#xff0c;录音&#xff0c;算法效果对比等等&#xff0c;依此写上该文章&#xff0c;以便有兴趣的朋友参考之用。 一、硬件链路图 二、导入21489Demo程序 2.1、Demo路径&#xff1a;2.2、导入ADI的21489的Demo程序 修改相关代码 oCommConfig.n…

小白学Pytorch系列--Torch.optim API Base class(1)

小白学Pytorch系列–Torch.optim API Base class(1) torch.optim是一个实现各种优化算法的包。大多数常用的方法都已得到支持&#xff0c;而且接口足够通用&#xff0c;因此将来还可以轻松集成更复杂的方法。 如何使用优化器 使用手torch.optim您必须构造一个优化器对象&…

下载和阅读Android源码

目录一、如何下载AOSP1.全量下载2.单个下载目录结构二、如何阅读AOSP1.要阅读哪些源码2.阅读源码的顺序和方式2.1 阅读顺序2.2 阅读方式3.用什么工具来阅读3.1 下载安装Source Insight3.2 导入AOSP源码3.3查看源码三、其他一、如何下载AOSP 源码下载是我们分析源码的开始&…

ctfshow愚人杯web复现

easy_signin 题目url base64解码是face.png&#xff0c;尝试flag.txt和flag.php&#xff0c;base64加密后传入都不对&#xff0c;用index.php加密后传入&#xff0c;看源码 将后面的base64解密得到flag 被遗忘的反序列化 源码 <?php# 当前目录中有一个txt文件哦 error_r…

Unity- 游戏结束以及重启游戏

文章目录游戏结束以及重启游戏建个游戏结束页面编写委托类 游戏主角 以及 ui管理类的脚本重启游戏游戏结束以及重启游戏 思路&#xff1a;利用Canvas创建好覆盖全屏的结束页面&#xff0c;默认关闭。游戏结束时&#xff0c;玩家控制的对象发起委托&#xff0c;ui管理收下委托&…

electron+vue3全家桶+vite项目搭建【六】集成vue-i18n 国际化

文章目录注意引入1.引入依赖2.集成vue i18n3.测试代码4.封装多语言切换组件5.测试多语言切换6.优化代码注意 已发现 9.2.2版本的vue-i18n 如果使用cnpm安装&#xff0c;打包会报错&#xff0c;使用npm或者pnpm安装依赖没有问题 引入 如果需要多语言支持&#xff0c;那么最好…

【100个 Unity实用技能】 | Lua中获取当前时间戳,时间戳和时间格式相互转换、时间戳转换为多久之前

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

【AI大比拼】文心一言 VS ChatGPT-4

摘要&#xff1a;本文将对比分析两款知名的 AI 对话引擎&#xff1a;文心一言和 OpenAI 的 ChatGPT&#xff0c;通过实际案例让大家对这两款对话引擎有更深入的了解&#xff0c;以便大家选择合适的 AI 对话引擎。 亲爱的 CSDN 朋友们&#xff0c;大家好&#xff01;近年来&…

Python自动录入ERP系统数据

大家好&#xff0c;我是毕加锁。 今天给大家带来的是用Python解决Excel问题的最佳姿势 文末送书&#xff01; 文末送书&#xff01; 文末送书&#xff01; 项目总体情况 软件&#xff1a;Pycharm 环境: Python 3.7.9(考虑到客户可能会有不同操作系统&#xff0c;为了兼容性…

【小程序】django学习笔记3

今天我们来做数据库和django的关联。 根据之前的代码应该看得出来我想做一个获取访客的ip地址并计算访问次数的app&#xff0c;所以必然会用到数据库。 这里选择用的是mysql(因为免费) 不一样的是这里我们打算用django提供的orm框架对数据库进行操作。 一. 环境准备 首先安…