springboot的拦截器,监听器,过滤器,servlet的使用(三大组件)

news2024/9/22 9:50:41

目录

  • 1. 拦截器
    • 1.1 简介
    • 1.2 使用
  • 2. 监听器
    • 2.1 简介
    • 2.2 使用
  • 3. 过滤器
    • 3.1 简介
    • 3.2 使用
  • 4. servlet
    • 4.1 简介
    • 4.2 使用
  • 5. 例子
  • 6. 心得

1. 拦截器

1.1 简介

Spring Boot 拦截器(Interceptor)是Spring MVC中用于在请求处理流程中执行某些操作的组件。它们允许你在请求到达控制器之前或响应发送回客户端之后插入自定义行为。这可以包括日志记录、身份验证、请求数据转换等。

实现一个Spring Boot拦截器
要创建一个Spring Boot拦截器,你需要遵循以下步骤:

  1. 创建一个拦截器类:实现HandlerInterceptor接口,并重写其方法(如preHandle、postHandle、afterCompletion)。
  2. 注册拦截器:在你的配置类中,通过实现WebMvcConfigurer接口并重写addInterceptors方法来注册你的拦截器。

1.2 使用

实现一下
首先创建一个拦截器类

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("前置拦截");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("后置拦截");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("最终拦截");
    }

}

注册拦截器

@Configuration
public class MyConfig implements WebMvcConfigurer {
    // 拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/hello");
    }
}

说明一下:

  • addInterceptor函数(实际上是一个方法,因为它被定义在InterceptorRegistry接口中,并由WebMvcConfigurer的实现类在配置时调用)的作用是将自定义的拦截器(HandlerInterceptor)注册到Spring MVC的拦截器链中。
  • 通过addPathPatterns方法指定哪些请求路径应该被该拦截器拦截。
  • 通过 excludePathPatterns 方法指定些请求路径应该被排除

在拦截器中可以写一些跳转或者添加一下属性到Model
比如:

2. 监听器

2.1 简介

在Spring Boot中,通常我们更多地依赖于Spring的事件监听机制(ApplicationListener)和Spring MVC的拦截器(Interceptor)来处理请求前后的逻辑,而不是传统的Servlet监听器(如ServletContextListener、HttpSessionListener等)。这是因为Spring Boot和Spring MVC提供了更高级别的抽象和更丰富的功能集,使得开发者能够更专注于业务逻辑的实现。

然而,如果你确实需要在Spring Boot应用中使用Servlet监听器,你仍然可以这样做,因为Spring Boot是建立在Servlet API之上的。

步骤:

  1. 创建Servlet监听器
  2. 注册Servlet监听器

2.2 使用

创建Servlet监听器

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 应用程序启动时执行的初始化操作
        System.out.println("Listener->应用程序已启动");
        // 加载配置文件、初始化数据库连接池等
        // ...
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 应用程序关闭时执行的清理操作
        System.out.println("Listener->应用程序即将关闭");
        // 关闭数据库连接池、释放资源等
        // ...
    }
}

注册:

@Configuration
public class MyConfig implements WebMvcConfigurer {
@Bean
    public ServletListenerRegistrationBean myListener(){
        ServletListenerRegistrationBean<MyListener> registrationBean = new
                ServletListenerRegistrationBean(new MyListener());
        return registrationBean;
    }
}

3. 过滤器

3.1 简介

在Spring Boot中,过滤器(Filter)是一种能够拦截请求和响应的组件,它可以在请求到达控制器之前或响应发送给客户端之后执行特定的代码。这使得过滤器非常适合用于处理日志记录、身份验证、请求预处理和响应后处理等任务。
Spring Boot 提供了几种方式来注册和使用过滤器,以下是一些常见的方法:

  1. 使用 @WebFilter 注解和 ServletRegistrationBean
    对于基于 Servlet 的应用,可以通过 @WebFilter 注解来定义一个过滤器,并使用 ServletRegistrationBean 在 Spring Boot 应用程序中注册这个过滤器。但是,请注意,这种方法依赖于 Servlet 容器对 @WebFilter 的支持,而且它更适用于传统的 Servlet 应用程序而不是纯粹的 Spring Boot 应用程序。

  2. 实现 Filter 接口并注册为 Bean
    在 Spring Boot 应用程序中,更常见的做法是实现 javax.servlet.Filter 接口,然后直接在配置类中将其注册为一个 Bean。这种方法使得过滤器的注册更加灵活,并且可以更容易地集成到 Spring 的依赖注入体系中。

3.2 使用

第二种方法

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter正在被创建");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//        servletRequest.getRequestDispatcher("/myFilter").forward(servletRequest,servletResponse);
        filterChain.doFilter(servletRequest, servletResponse); // 将请求传递给下一个过滤器或目标资源  
    }

    @Override
    public void destroy() {
        System.out.println("filter被销毁中。。。");
    }
}

注册函数:

 @Bean
 public FilterRegistrationBean myFilter(){
     FilterRegistrationBean registrationBean = new FilterRegistrationBean();
     registrationBean.setFilter(new MyFilter());
     registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
     return registrationBean;
 }

4. servlet

4.1 简介

在Spring Boot中,虽然Spring Boot的自动配置和嵌入式服务器(如Tomcat, Jetty, 或Undertow)极大地简化了传统Servlet应用程序的部署和配置,但Spring Boot仍然支持Servlet API的使用。你可以直接在Spring Boot应用中注册和使用Servlet,这为你提供了灵活性来集成需要Servlet API的旧系统或库。

4.2 使用

  1. 创建servlet
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;


public class MyServlet implements Servlet {


    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("servlet正在创建");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("正在服务!!!");
        System.out.println("走你!!!");
        servletRequest.getRequestDispatcher("/myServlet").forward(servletRequest,servletResponse);	// 跳转到/myServlet
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("servlet被销毁");
    }
}

  1. 注册
@Bean
public ServletRegistrationBean myServlet(){
    ServletRegistrationBean registrationBean = new ServletRegistrationBean( new MyServlet(),"/hello");
    return registrationBean;
}

5. 例子

登录的拦截器:在进行登录之前,判断是否有session,没有就跳转到登录界面
写一个拦截器

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class LoginInterceptor implements HandlerInterceptor {

    // 没有session 就跳转
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理之前进行调用(Controller方法调用之前)
        HttpSession session = request.getSession();
        if(session.getAttribute("user") == null){
            response.sendRedirect(request.getContextPath() + "/header");
            return false;
        }
        return true;
    }
}

注册:

@Configuration
@MapperScan("cn.tx.springboot.mapper")
public class TxMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        List<String> excludePatterns = new ArrayList<String>();
        // 这几个请求不拦截
        excludePatterns.add("/css/**");
        excludePatterns.add("/images/**");
        excludePatterns.add("/toLogin");
        excludePatterns.add("/header");
        excludePatterns.add("/login");
        // 防止收不到js
        excludePatterns.add("/webjars/**");
        // 添加
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns(excludePatterns);
    }
}

6. 心得

在这里插入图片描述

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

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

相关文章

Open3D 三维重建-Alpha Shapes (α-形状)

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.1.1函数 2.1.2参数详解 2.2完整代码 三、实现效果 3.1原始点云 3.2处理后点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新…

08-PCB工程文件的创建

1.创建工程文件 2.创建原理图库 3.创建PCB元件库 4.创建原理图 5.创建PCB 6.改名&#xff0c;保持和项目名一致 最后save。

uniapp获取swiper中子组件的内容高度

swiper有默认高度,如果不单独设置一个具体高度&#xff0c;swiper后面的内容将不会展示 这里展示的例子是: swiper中放有一个子组件,想要完整展示子组件的内容&#xff0c;swiper就需要获取到子组件的内容高度并设置 <!-- 注意: 这里的单位是 px,不是rpx --><swiper…

【STM32】IO口取反 | 寄存器方式 | 异或运算符 | 原理

目录 STM32 IO口取反 | 寄存器方式 | 异或运算符 | 原理1. 引言2. GPIO基础知识2.1 GPIO概述2.2 STM32的GPIO架构2.3 GPIO寄存器简介 3. GPIO引脚取反原理3.1 寄存器操作实现取反3.2 异或运算符的应用 4. 示例代码4.1 基础示例&#xff1a;LED闪烁4.2 应用实例&#xff1a;继电…

大数据面试SQL(三):每分钟在线直播人数

文章目录 每分钟在线直播人数 一、题目 二、分析 三、SQL实战 四、样例数据参考 每分钟在线直播人数 一、题目 有如下数据记录直播平台主播上播及下播时间&#xff0c;根据该数据计算出平台每分钟的在线直播人数。 这里用主播名称做统计&#xff0c;前提是主播名称唯一…

【初阶数据结构题目】16.用队列实现栈

用队列实现栈 点击链接答题 思路&#xff1a; 出栈&#xff1a;找不为空的队列&#xff0c;将size-1个数据导入到另一个队列中。 入栈&#xff1a;往不为空队列里面插入数据 取栈顶元素&#xff1a; 例如&#xff1a; 两个队列&#xff1a; Q1&#xff1a;1 2 3Q2&#xff1a;…

『大模型笔记』从API到Agent:万字长文洞悉LangChain工程化设计

『大模型笔记』从API到Agent&#xff1a;万字长文洞悉LangChain工程化设计 具体内容来自&#xff1a;从API到Agent&#xff1a;万字长文洞悉LangChain工程化设计

Spring源码解析(30)之AOP拦截链执行过程

一、前言 在上一节中我们介绍了AOP动态代理对象的创建过程&#xff0c;并且看到了Spring AOP在生成calllBacks的时候第一个拦截器就是&#xff1a;DynamicAdvisorInterceptor&#xff0c;所以我们通过代理对象执行对应的方法的时候就如跳入到这个拦截器中&#xff0c;接下来我们…

【RISC-V设计-07】- RISC-V处理器设计K0A之CSR

【RISC-V设计-07】- RISC-V处理器设计K0A之CSR 文章目录 【RISC-V设计-07】- RISC-V处理器设计K0A之CSR1.简介2.顶层设计3.端口说明4.寄存器说明5.代码设计6.总结 1.简介 控制和状态寄存器&#xff08;Control and Status Register&#xff0c;简称CSR&#xff09;是用于控制和…

使用历史版本比对法排查C++程序中的内存泄漏问题

目录 1、问题描述 2、使用Process Explorer实时查看程序的虚拟内存占用 2.1、对于内存泄漏问题&#xff0c;需要查看程序占用的虚拟内存 2.2、Windows任务管理器中看不到程序进程占用的虚拟内存&#xff0c;使用Process Explorer工具可以看到 2.3、通过Process Explorer工…

通世智库:姚力渟——第一次走进缓和医疗

2024年7月9日&#xff0c;我因工作原因&#xff0c;第一次以工作者的视角走进了位于北京市中心最具盛名的协和医院缓和医疗门诊&#xff0c;亲临现场去感受缓和医疗给患者及家属的贴心温暖和有益帮助。在此之前&#xff0c;我是一个惧怕医院&#xff0c;并时刻抱着能不去医院就…

Waterfox水狐浏览器:追求性能与隐私的64位网络探索者

大家好&#xff0c;今天电脑天空要为大家详细介绍一款基于Mozilla Firefox源代码开发的浏览器——Waterfox&#xff08;水狐浏览器&#xff09;。它专为64位系统优化&#xff0c;致力于提供更快速、更高效的浏览体验&#xff0c;并高度重视用户隐私保护。 主要特点 1. 高性能…

Stable Diffusion绘画 | 图生图-批量处理

批量处理中&#xff0c;对待处理图片的要求&#xff1a;宽高比一致 修改提示词后批量处理 调整参数&#xff1a; 确保宽高与原图一致增加一定的重绘幅度 调整提示词信息&#xff1a; 批量处理后&#xff0c;出图如下所示&#xff1a; 修改模型后批量处理 恢复提示词&#xf…

【数学建模】 多模数据与智能模型

文章目录 多模数据与智能模型1. 数字图像处理与计算机视觉1.1 数字图像的表示与处理1.1.1 认识OpenCV1.1.2 色彩学1.1.3 常见图像操作 1.2 数字图像的特征点1.2.1 Sobel算子1.2.2 Canny算子1.2.3 Harris角点检测1.2.4 ORB特征点检测 1.3 计算机视觉1.3.1 卷积神经网络1.3.2 YOL…

学习日志8.7--NGFW(Next Generation Firewall)下一代防火墙

目录 一、NGFW&#xff08;Next Generation Firewall&#xff09;下一代防火墙 二、防火墙CLI命令行配置 三、防火墙初始化Web登入 一、NGFW&#xff08;Next Generation Firewall&#xff09;下一代防火墙 防火墙是用来实现识别外部的安全流量&#xff0c;抵御外部的攻击流…

vue3+element-plus+flask 简易【工作日志本】小软件(过程超详细)

终于有时间继续学习技术了&#xff01;开发了一个简易的用于记录日常工作内容的小软件&#xff0c;权当学习和练手。功能如下&#xff1a;用户登录、日志内容的查、增、删、改以及导出。 开发环境&#xff1a; windows 10&#xff0c;mysql 8&#xff0c;Hbuilder X&#xff08…

Linux -- 进度条小程序

目录 一、缓冲区 二、回车与换行 三、进度条 1、版本一 2、版本二 在写小程序之前先来了解两个知识点 一、缓冲区 缓冲区(buffer)&#xff0c;它是内存空间的一部分。也就是说在内存空间中预留了一定的存储空间&#xff0c;这些存储空间用来缓冲输入或者输出的数据&#…

【eNSP模拟实验】交换机调整stp根端口和配置边缘端口

拓扑 关闭提示和设备重命名 将S1~S4交换机都做如下相关对应的配置 <Huawei>sys [Huawei]un in en [Huawei]sys S1 调整根端口 当前S3交换机生成树简要信息&#xff0c;其中e0/0/1是阻塞端口&#xff0c;e0/0/5是根端口。如何让e0/0/5变成阻塞端口&#xff0c;让e0/0/1…

【面试题】IDEA实现Debug远程调试Linux中的系统

有朋友面试时被问到&#xff0c;怎么远程调试部署在Linux中的系统&#xff1f;听到这个问题&#xff0c;那位朋友直接懵了&#xff0c;第一反应是震惊&#xff0c;已经部署在Linux中的系统还能调试&#xff1f; 沉默了几秒&#xff0c;只好说没有远程调试过Linux中的系统&#…

Debian 12 Linux系统安装Mongodb服务器步骤

在本地或云中运行的 Debian12 或 11 Linux 发行版上设置 MongoDB 数据库服务器并不是一件困难的事情&#xff0c;但是&#xff0c;必须知道如何使用终端和 Linux 命令行。虽然 MongoDB 除了社区版之外还提供了企业版&#xff0c;但在这里我们将使用这个免费的开源 NoSQL 文档数…