SpringBoot的Interceptor拦截器的简介和实际使用

news2025/3/1 11:53:45

拦截器(Interceptor)

概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行。

作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。

快速入门

定义拦截器

实现HandlerInterceptor接口,并重写其所有方法。 

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override //目标方法执行前的执行,返回true放行,返回false不放行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override //目标方法执行后执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override //视图渲染执行后执行,最后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

注册拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**");
    }
}

拦截器-拦截路径

拦截路径

含义

举例

/*

一级路径

能匹配/depts,/emps,/login,不能匹配 /depts/1

/**

任意级路径

能匹配/depts,/depts/1,/depts/1/2

/depts/*

/depts下的一级路径

能匹配/depts/1,不能匹配/depts/1/2,/depts

/depts/**

/depts下的任意级路径

能匹配/depts,/depts/1,/depts/1/2,不能匹配/emps/1

拦截器-执行流程

 Filter与Interceptor区别

  • 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
  • 拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。

 登录验证

  • 获取请求url。 判断请求url中是否包含login,如果包含,说明是登录操作,放行。
  • 获取请求头中的令牌(token)。
  • 判断令牌是否存在,如果不存在,返回错误结果(未登录)。
  • 解析token,如果解析失败,返回错误结果(未登录)。
  • 放行。

                                     

Interceptor的实现

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override //目标方法执行前的执行,返回true放行,返回false不放行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取url
        String url = request.getRequestURL().toString();
        log.info("url路径:{}",url);
        //获取token
        String token = request.getHeader("token");
        log.info("token:{}",token);
        //如果没有Token
        if (!StringUtils.hasLength(token)) {
            extracted(response);
            return false;
        }
        //解析token
        try {
            JwtUtils.parseJwt(token);
        } catch (Exception e) {
            e.printStackTrace();
            extracted(response);
            return false;
        }
        return true;
    }

    private void extracted(HttpServletResponse response) throws IOException {
        Result noLogin = Result.error("用户未登录");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(JSONObject.toJSONString(noLogin));
    }

    @Override //目标方法执行后执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override //视图渲染执行后执行,最后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

配置Interceptor

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }
}

测试

 

 

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

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

相关文章

干货 | 关于等效电路图

等效电路图是电路原理中非常重要的一个概念,在电子工程、通信工程和电力工程等领域中经常被使用。等效电路图是指将一个复杂的电路简化成一个简单的电路,同时保持电路的等效性质,以便于分析和设计电路。在本文中,我们将详细介绍等…

回溯法 思想

回溯法(back tracking)(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回到上一…

ChatGPT安全性受质疑 国家网信办发布《生成式人工智能服务管理办法(征求意见稿)》

你是否曾经和一款人工智能对话?它们似乎能够理解你的问题,并给出令人满意的答案。ChatGPT是目前最流行的人工智能。它是由OpenAI开发的一款基于GPT技术的自然语言处理模型。 通过训练大量的文本数据,ChatGPT可以理解并回答用户的问题&#xf…

Excel vba直接调用斑马打印机进行打印代码

1.难点 1.1 vba 对zebra打印机调用方法open 1.2 zebra打印机默认支持UTF8 编码方式,对应编码命令为CI28; 支持GB2312 GB18030 ASCII码编码方式,对应编码命令为CI26 1.3 VBA对中文只支持GB2312, 而excel 是默认支持UTF8的, excel 与VBA编…

钛碳化铝(Ti3AlC2)在实验检测领域中的应用

钛碳化铝Ti3AlC2是一种属于MAX相(M代表金属元素,A代表主族元素,X代表碳或氮)的陶瓷材料。它是由钛、铝和碳组成的复合材料,拥有优异的力学、热学和电学性能。由于这些性质,Ti3AlC2已成为近年来研究和应用的…

[Netty源码] ByteBuf相关问题 (十)

文章目录 1.ByteBuf介绍2.ByteBuf分类2.1 AbstractByteBuf2.2 AbstractReferenceCountedByteBuf2.3 UnpooledHeapByteBuf2.4 UnpooledDirectByteBuf2.5 PooledDirectByteBuf 1.ByteBuf介绍 字节缓冲区, jdk NIO的ByteBuffer比较复杂, netty重新设计了ByteBuf用以代替ByteBuffe…

直方图实例详解(颜色直方图、灰度直方图)

直方图实例详解(颜色直方图、灰度直方图) 本篇目录: 🦄 一、前言 🦄 二、直方图的概念 🦄 三、颜色直方图 (1)、颜色直方图定义 (2)、颜色直方图使用方法…

线程池中的拒绝策略

线程池中的拒绝策略 什么情况下出发拒绝策略? 当提交任务数大于corePoolSize的时候,会将多余任务缓存在workQueue阻塞队列中当阻塞队列满了,会扩充线程数当扩充线程数大于maximumPoolSize的时候,就会触发拒绝策略 也就是说,当任务数大于workQueue.size() 和maximumPoolSize…

同态随机基加密的量子多方密码-数学公式

众所周知,信息和信息处理的完全量子理论提供了诸多好处,其中包括一种基于基础物理的安全密码学,以及一种实现量子计算机的合理希望,这种计算机可以加速某些数学问题的解决。这些好处来自于独特的量子特性,如叠加、纠缠…

《PyTorch 深度学习实践》第9讲 多分类问题(Kaggle作业:otto分类)

文章目录 1 一些细碎代码1.1 Cross Entropy1.2 Mini-batch: batch_size3 2 示例3 作业任务描述查看数据进行建模提交Kaggle总结 该专栏内容为对该视频的学习记录:【《PyTorch深度学习实践》完结合集】 专栏的全部代码、数据集和课件全放在个人GitHub了,…

分享:作业帮在多云环境下的高可用双活架构优化实践

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 本文来自OceanBase社区分享,仅限交流探讨。作者介绍:刘强,就职于作业帮基础架构 DBA 团队,负责分布式数据库的探索和使用,协同研发团队在…

node 链接MySql数据库并 进行增删改查

在Navicat中创建数据库创建表 那么就开始吧! 一、链接数据库 mysql - npmA node.js driver for mysql. It is written in JavaScript, does not require compiling, and is 100% MIT licensed.. Latest version: 2.18.1, last published: 3 years ago. Start usin…

15.使用组件

目录 1 独立组件 2 私有子组件 3 全局组件 1 独立组件 我当前App.vue的内容是这样的 LEFT.vue的内容是这样的 RIGHT.vue的内容是这样的 那么这个时候我们认为 left.vue,right.vue与App.vue 是彼此独立的三个组件 2 私有子组件 我现在想把LEFT.vue与RIGHT.…

操作系统原理 —— 操作系统运行机制与体系结构(三)

什么是操作系统的指令? 指令就是处理器(CPU)能识别、执行的最基本命令。 比如我们平时写的 Java 代码、C 语言代码,CPU 它能直接识别并且运行吗? 当然是不行的。 Java、C 语言这些都属于高级语言,它们还需要经过一系列的编译最…

再也不怕面试官问:详解Synchronized和Lock的实现原理及使用场景

1、Synchronized与Lock对比 实现方式:Synchronized是Java语言内置的关键字,而Lock是一个Java接口。锁的获取和释放:Synchronized是隐式获取和释放锁,由Java虚拟机自动完成;而Lock需要显式地调用lock()方法获取锁&#…

Moonbeam 操作指南|使用Docker和Systemd在Moonbeam上运行节点

运行全节点允许您存储链的本地副本、验证新的区块、获取对RPC端点的本地访问权限以及配置为创作区块的收集人等。 📄 查看开发者文档 重点操作如下: 虽然运行(和升级)您自己的节点需要付出时间和精力,但同时您也会获…

动力节点Vue笔记——第四章Vue与Ajax

四、Vue与AJAX 4.1 回顾发送AJAX异步请求的方式 发送AJAX异步请求的常见方式包括: 原生方式,使用浏览器内置的JS对象XMLHttpRequest const xhr new XMLHttpRequest()xhr.onreadystatechange function(){}xhr.open()xhr.send() 原生方式&#xff0…

【算法题】2583. 二叉树中的第 K 大层和

题目: 给你一棵二叉树的根节点 root 和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和(不一定不同)。如果树少于 k 层,则返回 -1 。 注意,如果两个节点与根节点的距离相同&…

Android kotlin 用RecyclerView(androidx+BRVAH3.0.6)实现从底部弹出列表对话框(单选/多选)功能

文章目录 一、实现效果二、引入依赖三、实现源码1、实体类2、适配器单选/多选3、框架弹窗AnyLayer单选/多选3、实现视图一、实现效果 二、引入依赖 在app的build.gradle在添加以下代码 1、框架弹窗AnyLayer(github官网):implementation "com.github.goweii:AnyLayer:4.1…

linux(CentOS 6.5) 安装 Oracle 11g步骤

第一步:准备 1、服务器环境: 系统:CentOS 6.5 (Final) x86_64(Py3.7.8) 2、Navcat: 版本16.0.14 - Premium(这里数据库管理工具,不限,可以用其他的) 3、FinalShell: 版本3.9.2.2&a…