SpringBoot 三种拦截http请求方式Filter,Interceptor和AOP

news2024/11/24 17:04:54

1 Filter

Filter常被叫做过滤器,filter的调用周期大致如下

在这里插入图片描述
也就是说filter在servlet之前,没有办法在filter中获取springboot中的java bean对象。

Filter生命周期方法

init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源。
doFilter:每一次请求被拦截资源时,会执行。执行多次。
destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

值得注意的是,Filter并不依赖于Springboot,是javaWeb自带的,所以即使你用的其他框架,也完全不受影响。

filter的使用如下(个人比较喜欢用注解的方式)

package cn.iyuta.golive.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "MyFilter", urlPatterns = {"/v/*"})
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化操作
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // todo 你想做的过滤操作

        // 调用下一个过滤器或目标资源的处理方法
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 销毁操作
    }
}

2 Interceptor

Interceptor常被叫做拦截器,加上Interceptor,filter后的调用周期大致如下

在这里插入图片描述
Spring Boot中,拦截器是一种用于拦截和处理HTTP请求的机制。它是Spring框架提供的一种中间件,用于在请求到达控制器(Controller)之前或之后执行一些共享的逻辑。
值得注意的是,Intercepter是基于Springboot的,其他框架是无法使用的,而且由于其基于java bean,所以在其当中你可以将任何java bean传入其中,使得你可以获取上下文路径等信息。

Intercepter调用函数

preHandle:调用 Controller之前执行。
postHandle:调用 Controller之前执行。

Intercepter的使用如下

自定义Intercepter

package cn.iyuta.golive.interceptor;

import cn.iyuta.golive.entity.UserEntity;
import cn.iyuta.golive.repository.UserRepository;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Optional;

public class BaseInterceptor implements HandlerInterceptor {
 
    //可以通过配置类注入想要的类
    private final UserRepository userRepository;
 
    public BaseInterceptor(UserRepository userRepository){
        this.userRepository = userRepository;
    }
 
    //方法执行前执行的接口
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器执行=========");
        //可以在方法执行前执行其他的类
        Optional<UserEntity> byId = userRepository.findById(1);

        return true;
    }
    //方法执行后执行的方法
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
 
    }
    //返回处理的方法
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
 
    }
}

设置拦截的规则:

package cn.iyuta.golive.interceptor;
 
import cn.iyuta.golive.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class BaseInterceptorConfig implements WebMvcConfigurer {
 
    private final UserRepository userRepository;
    //将需要的类进行注入
    @Autowired
    public BaseInterceptorConfig(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new BaseInterceptor(userRepository))// 添加拦截器
                .addPathPatterns("/**")  //添加拦截路径
                .excludePathPatterns("/swagger/**", "/swagger2/**");//排除的拦截路径(此路径不拦截)
 
    }
}

3 AOP注解,当然你也可以通过AOP来实现拦截的功能。在前后做一些事情

在这里插入图片描述
Spring Boot中,AOP是一种更为灵活,可以理解成对调用方法的增强,它几乎可以自定义拦截到你代码里面任何想拦截的地方。

详情可以参考之前的 日志添加实现

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

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

相关文章

私人健身与教练预约管理系统设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

电脑如何一键修复所有dll缺失,几种修复dll文件丢失的方法

修复所有DLL&#xff08;动态链接库&#xff09;文件缺失的问题通常不可能通过单一的"一键修复"按钮来实现&#xff0c;因为DLL文件缺失可能由各种不同的原因导致&#xff0c;比如应用程序安装不正确、病毒感染、或系统文件损坏等。 使用内置的系统文件检查器&#x…

Axure RP 8中文---快速原型设计工具,一站式解决方案

Axure RP 8是一款专业的快速原型设计工具&#xff0c;以其直观易用的界面和丰富的功能受到广大用户的青睐。它支持用户通过拖放操作快速创建交互式原型&#xff0c;包括线框图、流程图等&#xff0c;并具备高保真度的设计能力。Axure RP 8还提供了团队协作和共享功能&#xff0…

3分钟教你弄懂【01背包问题】

背包问题 介绍 将有限物品按找最大价值装进有限体积的背包中去 核心步骤 1.确定状态表示 2.确定边界和遍历顺序 3.找到状态转移方程 先上 Coding #include <iostream> using namespace std;const int N 300; int itemSize[N]; //每件物品的大小&#xff08;体积…

推荐一款电子翻页书制作软件

随着数字化时代的到来&#xff0c;电子书籍越来越受到人们的喜爱。而一款优秀的电子翻页书制作软件&#xff0c;则能够帮助你轻松制作出专业级的电子书&#xff0c;让你的阅读体验更加丰富多彩。 今天&#xff0c;我们就来为大家推荐一款优秀的电子翻页书制作软件——FLBOOK在线…

【QT入门】 Qt代码创建布局之栅格布局详解

往期回顾&#xff1a; 【QT入门】 Qt自定义信号后跨线程发送信号-CSDN博客 【QT入门】 Qt内存管理机制详解-CSDN博客 【QT入门】 Qt代码创建布局之水平布局、竖直布局详解-CSDN博客 【QT入门】 Qt代码创建布局之栅格布局详解 一、什么是栅格布局 所谓栅格布局&#xff0c;就是…

vue动态渲染本地路径图片不显示的解决方案,v-fro 渲染本地图片路径不显示

1、第一种解决方法 如果直接使用本地路径渲染是渲染不出来的&#xff0c;因为这种情况下渲染时会发送网络请求加你的本地地址所以渲染不出来。 这样怎么能找到路径&#xff1f;解决方案如下 // 渲染正常渲染即可 <div v-for"(item, index) in imgPath" :key&quo…

Python时间

UTC ~ 北京时间 【差8小时】 格式化日期时间为字符串:strftime 时间戳-1970.1.1到现在的秒数:time.time() AttributeError: partially initialized module ‘datetime’ has no attribute ‘fromtimestamp’ (most likely due to a circular import) 改正&#xff1a;文件名和…

数学建模中的这些神仙图都是怎么画出来的?

在各大数模比赛中&#xff0c;如国赛、美赛、数维杯这些比赛中&#xff0c;获得 特等奖论文往往不仅在问题求解上有深度&#xff0c;更在图表的呈现上展现了高逼格的水平。数乐君将带大家揭示一些制作高逼格图片的绘制技巧&#xff0c;助你在论文中展现更专业、美观的图表。&am…

【力扣hot100】207 课程表(c++、python)解析

相关题目: 210 课程表2 【力扣hot100】207 课程表(c++、python)解析 1.官方题解:1.1深搜c++版本python版本1.2广搜c++版本1.官方题解: 这是一题经典的「拓扑排序」问题 给定一个包含 n 个节点的有向图 G,我们给出它的节点编号的一种排列,如果满足:对于图 G 中的任意…

用友BI方案:一键搞定财务、销售、生产等分析

别人家做用友的数据分析&#xff0c;从零开始搭建分析模型、设计BI数据可视化报表&#xff0c;反复测试修改&#xff0c;耗时耗力&#xff0c;效果未知。奥威BI做用友的数据分析&#xff0c;用用友BI方案&#xff0c;注册、下载执行&#xff0c;自动取数、计算指标、分析数据、…

国内用户掌握ChatGPT,你已超越万人!

在数字时代&#xff0c;掌握前沿技术往往意味着拥有更多的机遇和可能。ChatGPT&#xff0c;作为当前最热门的人工智能技术之一&#xff0c;已经证明了其在各个领域的广泛应用价值。但在中国&#xff0c;能熟练使用ChatGPT的人究竟领先了多少人&#xff1f;让我们深入探讨。>…

网络——套接字编程TCP

目录 服务端 创建套接字&#xff08;socket&#xff09; 服务端绑定&#xff08;bind&#xff09; 服务端监听&#xff08;listen&#xff09; 服务器接收&#xff08;accept&#xff09; 服务端处理&#xff08;read & write&#xff09; 客户端 创建套接字&#…

安捷伦Agilent 34401A数字万用表

181/2461/8938产品概述&#xff1a; Agilent34401A 万用表将准确性、速度、测量简便性和多功能性结合到坚固的 6 1/2 位数字万用表中&#xff0c;无论在工作台上还是在系统中都同样适用。您可以以 5 1/2 位数的价格获得 6 1/2 位数的性能。除了直流和交流电压、直流和交流电流…

瑞吉外卖实战学习--登录过滤器和判断是否登录过

完善登录功能 1、创建自定义过滤器LoginCheckFiler1.1通过WebFilter创建过滤器1.2 验证是否可以拦截请求1.3 代码 2、在启动类加入注解ServletComponentScan 用来扫描过滤器触发所有的过滤器ServletComponentScan 3、完善过滤器的处理逻辑3.1判断是否需要是要放行的请求3.2判断…

PTA引水入城

在一个遥远的国度&#xff0c;一侧是风景秀美的湖泊&#xff0c;另一侧则是漫无边际的沙漠。该国的行政区划十分特殊&#xff0c;刚好构成一个 N 行 M 列的矩形&#xff0c;如上图所示&#xff0c;其中每个格子都代表一座城市&#xff0c;每座城市都有一个海拔高度。 为了使居民…

【Java - 框架 - Lombok】(2) SpringBoot整合Lombok完成日志的创建使用 - 快速上手;

"SpringBoot"整合"Lombok"完成日志的创建使用 - 快速上手&#xff1b; 环境 “Java"版本"1.8.0_202”&#xff1b;“Lombok"版本"1.18.20”&#xff1b;“Spring Boot"版本"2.5.9”&#xff1b;“Windows 11 专业版_22621…

安科瑞智慧安全用电综合解决方案

概述 智慧用电管理云平台是智慧城市建设的延伸成果&#xff0c;将电力物联网技术与云平台的大数据分析功能相结合&#xff0c;实现用电信息的可视化管理&#xff0c;可帮助用户实现安全用电&#xff0c;节约用电&#xff0c;可靠用电。平台支持web&#xff0c;app&#xff0c;微…

113 链接集11--ctrl+左键单击多选

1.ctrl左键单击多选&#xff0c;单击单选 精简代码 <div class"model-list"><divmousedown.prevent"handleClick(item, $event)"class"model-list-item"v-for"item in modelList":key"item.id":class"{ model…

【超全详解一文搞懂】Scala基础

目录 Scala 01 —— Scala基础一、搭建Scala开发环境安装Scala编译器在IDEA中进行scala编码 二、Scala简介与概述Scala简介Scala概述Scala代码规范 三、理解Scala变量与数据类型Scala的变量与常量Scala和Java变量的区别 Scala的数据类型 四、Scala的程序逻辑1.表达式2.运算符3.…