监听器、过滤器、拦截器,参考多篇文章整合而成,没有千篇一律的抽象回答!

news2024/11/15 22:54:11

参考文章1

过滤器、监听器、拦截器

  • 一、监听器
  • 二、过滤器
    • 1. POM.xml导包
    • 2. web.xml配置
    • 3. Filter过滤器编程
  • 三、拦截器
    • 1. 定义拦截器
    • 2. 配置加载拦截器
    • 3. 新建页面的存放地点
  • 四、过滤器、监听器、拦截器
    • 1. 三者作用
    • 2. 三者调用的时序(监听器、过滤器、拦截器)
    • 3. 三者的总结

一、监听器

Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接口的服务器端程序,在javax.servlet.ServletContextListener接口中定义了2种方法。

  • void contextInitialized(ServletContextEvent sce) 监听器的初始化
  • void contextDestroyed(ServletContextEvent sce) 监听器销毁
public class ServletContextListenerUtil implements ServletContextListener{  
 
 //监听器的初始化:随web应用的启动而启动 
 @Override 
 public void contextInitialized(ServletContextEvent sce) {  
        System.out.println("监听器ServletContextListenerUtil初始化");  
    }  
 
 //监听器销毁:随web应用的停止而销毁 
 @Override 
 public void contextDestroyed(ServletContextEvent sce) {  
        System.out.println("监听器ServletContextListenerUtil销毁");  
    }  
} 

二、过滤器

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,在javax.servlet.Filter接口中定义了3个方法:

  • void init(FilterConfig filterConfig) 用于完成过滤器的初始化
  • void destroy() 用于过滤器销毁前,完成某些资源的回收
  • void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) 实现过滤功能,该方法对每个请求增加额外的处理

1. POM.xml导包

 <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl-api</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.25</version>
    </dependency>

2. web.xml配置

<filter> 
 <filter-name>encodingFilter</filter-name> 
 <!-- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> --> 
 <filter-class>com.cn.util.FilterUtil</filter-class> 
 <async-supported>true</async-supported> 
 <init-param> 
 <param-name>encoding</param-name> 
 <param-value>UTF-8</param-value> 
 </init-param> 
</filter> 
<filter-mapping> 
 <filter-name>encodingFilter</filter-name> 
 <url-pattern>/*</url-pattern> 
</filter-mapping> 

3. Filter过滤器编程

public class FilterUtil implements Filter{  
 
 @SuppressWarnings("unused")  
 private FilterConfig filterConfig; 

 //初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现! 
 @Override 
 public void init(FilterConfig filterConfig) throws ServletException {  
 this.filterConfig = filterConfig;  
        System.out.println("过滤器Filter初始化");  
    }  
          //Chain : 链
          /*
          1. 过滤中的所有代码,在过滤特定请求的时候都会执行
          2. 必须要让过滤器继续同行
              chain.doFilter(request,response);
           */ 

 @Override 
 public void doFilter(ServletRequest request, ServletResponse response,  
            FilterChain chain) throws IOException, ServletException {  
 if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) {  
 throw new ServletException("FilterUtil just supports HTTP requests");  
        }  
        HttpServletRequest httpRequest = (HttpServletRequest) request;  
        HttpServletResponse httpResponse = (HttpServletResponse) response;  
        httpRequest.setCharacterEncoding(this.filterConfig.getInitParameter("encoding"));  
        httpResponse.setCharacterEncoding(this.filterConfig.getInitParameter("encoding"));  
        chain.doFilter(httpRequest, httpResponse);  	//让我们的请求继续走,如果不写,程序到这里就被拦截停止!
    }  
 
 //销毁:web服务器关闭的时候,过滤器会销毁
 @Override 
 public void destroy() {  
        System.out.println("过滤器Filter销毁");  
    }  
}  

三、拦截器

在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法

preHandle:原始方法调用前执行

  • 参数:
  1. request:请求对象
  2. response:响应对象
  3. handler:被调用的处理器对象
  • 返回值:
  1. 返回值为true,则执行
  2. 返回值为false,则不执行

postHandler:原始方法调用后执行

  • 参数:
  1. request:请求对象
  2. response:响应对象
  3. handler:被调用的处理器对象
  4. modelAndView:如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行跳

afterCompletion:原始方法调用完成后执行

  • 参数:
  1. request:请求对象
  2. response:响应对象
  3. handler:被调用的处理器对象
  4. ex:异常对象

1. 定义拦截器

@Component //注意当前类必须受Spring容器控制
//定义拦截器类,实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor {
     @Override
    // 原始方法调用前执行的内容
    // 返回值类型可以拦截控制的执行,true放行,false终止
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle..." + contentType);
        //获取session中的数据
        Object employee = request.getSession().getAttribute("employee");

        //若为空,不放行,且写回页面指定数据
        if (employee == null) {
            R r = R.error("NOTLOGIN");
            response.getWriter().print(JSON.toJSON(r));
            return false;
        }
        return true;
    }

    @Override
    // 原始方法调用后执行的内容
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...");
    }

    @Override
    // 原始方法调用完成后执行的内容
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion...");
    }
}

2. 配置加载拦截器

方式一:可以继承WebMvcConfigurationSupport,但是默认静态资源路径不好使,必须重新映射

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        // 配置拦截器
        registry.addInterceptor(myInterceptor)
            .addPathPatterns("/**") // 需要拦截的路径(/** 拦截所有路径)
            .excludePathPatterns("/employee/login","/backend/**","/front/**");//放行静态资源和登陆资源;
          
    }
}

方式二:可以实现WebMvcConfigurer接口,默认静态资源路径好使.还可以重新映射

@Configuration
// 实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class MvcConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    // 拦截器 添加拦截器并设定拦截的访问路径, 路径可以通过可变参数设置多个
	/**
 	  * addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
 	  * addPathPatterns:用于设置拦截器的过滤路径规则;addPathPatterns("/**")对所有请求都拦截
 	  * excludePathPatterns:用于设置不需要拦截的过滤规则
 	  * 拦截器主要用途:进行用户登录状态的拦截,日志的拦截等。
 	*/
    pulbic void addInterceptors(InterceptorRegistry registry) {
    	// 配置拦截器
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/**")// 需要拦截的路径(/** 拦截所有路径)
            	.excludePathPatterns("/employee/login","/backend/**","/front/**");//放行静态资源和登陆资源; 
          
    }
}

3. 新建页面的存放地点

方式一:我们可以查看WebProperties类的源码,看到静态资源可以存在于以下类路径下的几个路径中任意一个

  • /META-INF/resources/
  • /resources/
  • /static/
  • /public/

方式二:我们也可以将路径放在类路径下,通过mvc的配置类放行静态资源

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    // 拦截器 添加拦截器并设定拦截的访问路径, 路径可以通过可变参数设置多个
	/**
 	  * addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
 	  * addPathPatterns:用于设置拦截器的过滤路径规则;addPathPatterns("/**")对所有请求都拦截
 	  * excludePathPatterns:用于设置不需要拦截的过滤规则
 	  * 拦截器主要用途:进行用户登录状态的拦截,日志的拦截等。
 	*/
    pulbic void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/employee/login","/backend/**","/front/**");//放行静态资源和登陆资源; 
    }
    
    @Override
    // 设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载
 	/**
 	  * addResoureHandler:指的是对外暴露的访问路径
 	  * addResourceLocations:指的是内部文件放置的目录
 	 */
    pulbic void addResourceHandlers(ResourceHandlerRegistry registry) {
    	// 当访问/XXX/????时候,从/xxx目录下查找内容
    	
        // 1、注册backend静态资源处理方式 **匹配多级路径
        registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
        // 2、注册front静态资源处理方式
        registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
    }
}

四、过滤器、监听器、拦截器

1. 三者作用

  • 监听器(Listener):当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到监听器。
  • 过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。
  • 拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。

2. 三者调用的时序(监听器、过滤器、拦截器)

  • 监听器(Listener):随web应用的启动而启动 ,随web应用的销毁而销毁,所以贯穿整个Web服务 。
  • 过滤器(Filter):首先检测URL是符合过滤器的Servlet映射,如果符合就过滤,即执行过滤器代码。所以是在进入Servlet之前。
  • 拦截器(Interceptor):preHandle、postHandler、afterCompletion方法表明,拦截器是在Servlet中执行的。

3. 三者的总结

  • 监听器:从用户访问到响应返回,整个Web服务过程。负责监听发生的事件,做出相应动作。
  • 过滤器:在进入Servlet之前,判断能不能进入Servlet。
  • 拦截器:在进入Servlet之后,对方法进行补充增强,有点像AOP

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

ESP32设备驱动-DS18B20温度传感器驱动

DS18B20温度传感器驱动 1、DS18B20驱动 DS18B20 是一款温度传感器,可用于各种简单的项目。 通过使用 One-Wire (I2C) 总线,可以将多个传感器连接到ESP32。 DS18B20 的成本也相对较低,只需要一个额外的 4k7 上拉电阻。在本文中,将创建一个基本示例,通过串行读取温度和输出…

java ssm酒店客房管理系统设计

目 录 1 绪 论 1 1.1 系统开发背景 1 1.2 开发意义 1 1.3 可行性分析 1 1.3.1 技术可行性分析 2 1.3.2 市场需求的可行性分析 2 1.4 国内外发展状况 2 1.5 本文中的章节介绍 2 2 开发技术简介 3 2.1 B/S简介 3 2.2 MYSQL的主要功能 3 …

竟然34%的孩子有腺样体肥大,保守还是手术?

腺样体肥大是一个常见的问题&#xff0c;患病率也越来越高。研究发现&#xff0c;34%的儿童和青少年患有这种疾病。腺样体肥大最容易导致鼻塞、口腔呼吸、儿童打鼾、睡眠影响等问题&#xff0c;严重会导致反复鼻窦炎、中耳炎、听力损伤&#xff0c;一些父母也知道它可能会导致孩…

idea插件restfultool和httpclient

restfultool使用测试controllerRestController RequestMapping("/api") Slf4j public class ApiController {GetMapping("test1")public String test1(RequestParam String msg) {return "hello world " msg;}GetMapping("test2/{msg}&quo…

【华为上机真题】密码要求

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

Pytorch——anaconda环境下安装GPU版本

首先查看自己 CUDA 搜索 点击 系统信息 可以看到&#xff0c;我的CUDA 是 11.1版本 随后上官网查找匹配的 pytorch 、torchvision、torchaudio 版本 Previous PyTorch Versions | PyTorch 然后直接对 .whl 文件进行下载 https://download.pytorch.org/whl/torch_stable.ht…

操作系统-进程管理

一、进程的组成和状态 1、操作系统的作用:通过资源管理提高计算机系统的效率改善人机界面向用户提供友好的工作环境。 2、操作系统的特征:并发性、共享性、虚拟性、不确定性。 3、操作系统的功能:进程管理、存储管理、文件管理、设备管理、作业管理。 4、操作系统的分类:批处理…

创业青年张继群:数智强农 现代农业加“数”前行

富贵险中求,也在险中丢,求时十之一,丢时十之九。 大丈夫行事,当摒弃侥幸之念,必取百炼成钢,厚积分秒之功,始得一鸣惊人。 央广网南宁1月11日消息(记者罗兰 通讯员张思颖)“经过此次比赛,在今后的推广中,我们会深入思考到底怎样才能把智慧农业做好,到底怎样才能真…

程序员为什么要写技术博客?都在哪些平台呢?

目录 一、程序员为什么要写技术博客&#xff1f; 1、真正掌握技术 2、没有人会那么在意你 3、珍惜时间 4、懒于思考&#xff0c;疏于总结 5、碎片化学习 6、优秀大神 7、更好的求职机会 8、努力的人一直都有 二、程序员都在哪些平台写技术博客呢&#xff1f; 1、git…

Python 采集免费代理,并检测其是否可用

本篇博客将采集互联网中公开代理 IP&#xff0c;并通过 IP 检测站点检测代理的可用性。 未来该内容将会被集成到 爬虫训练场 中。 &#x1f4b0;学习目录&#x1f4b0;Python 采集免费代理 IP模块准备与目标站点说明实战采集代理 IP 可用性检测对接站点为何使用代理 IP&#xf…

9. 使用SMTP发送邮件

1. SMTP协议 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议, 它是一组用于传送邮件的规则&#xff0c;由它来控制信件的中转方式。 SMTP是发送邮件的协议&#xff0c;python内置对SMTP的支持&#xff0c;可以发送纯文本邮件、HTML邮件以及带附…

python学习 --- 字符串基础

目录 一、字符串的驻留机制 1、驻留机制 2、驻留机制的几种情况&#xff08;使用交互模式&#xff09; 3、强制驻留 4、字符串驻留机制的优缺点 二、字符串的常用操作 1、字符串的查询操作 2、字符串大小写转换操作 3、字符串内容对齐操作 4、字符串劈分操作 5、判断…

【c语言进阶】动态内存管理知识大全(下)

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏c语言学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的激励和…

AxMath使用教程+常用符号与公式(持续更新中)

前言 这两天学了学Latex&#xff0c;主要是为了以后写毕业论文做铺垫&#xff0c;而且Latex在数学公式这一方面&#xff0c;要比Word方便许多&#xff0c;于是我就下载了一款国产的公式编辑器——AxMath。永久会员不贵&#xff0c;只要36元&#xff0c;而且软件很好用&#xf…

vue全家桶(一)基础知识

vue全家桶&#xff08;一&#xff09;1.vue基本使用2.vue模板语法1.差值表达式2.指令1.什么是指令2.数据绑定指令3.双向数据绑定4.事件绑定4.1click4.2事件修饰符4.3按键修饰符4.4属性绑定4.5-指令v-model的本质4.6 样式绑定4.6.1 class样式处理4.6.2 style样式处理4.7 分支循环…

Pytorch深度强化学习案例:基于DQN实现Flappy Bird游戏与分析

目录1 案例介绍2 构造深度Q网络3 经验回放与目标网络4 训练流程5 实验分析1 案例介绍 Flappy Bird是一款由来自越南的独立游戏开发者Dong Nguyen所开发的作品&#xff0c;于2013年5月24日上线。 在Flappy Bird中&#xff0c;玩家只需要用一根手指来操控&#xff1a;点击一次屏…

P49 BFC 块级格式化上下文 块级格式化上下文 BFC渲染区域: 创建BFC的元素,它的自动高度需要计算浮动元素. 高度塌陷例子

目录块级格式化上下文BFC渲染区域:创建BFC的元素&#xff0c;它的自动高度需要计算浮动元素.高度塌陷例子&#xff1a;第一种方法 clearfix::after第二种解决办法 :绝对定位第三种解决办法&#xff1a;overflow: scroll;第四种方法&#xff1a;clearfix hidden创建BFC的元素&am…

21版本FL Studio水果音乐制作软件下载

因为对音乐有一些了解&#xff0c;所以周边有不少朋友会问我很多关于音乐的问题&#xff0c;其中比较多是学习音乐到底用哪款软件比较好。每次遇到这样的问题&#xff0c;我都会告诉他们&#xff0c;就是我一直在用的音乐制作软件FL Studio。音乐制作软件FL Studio&#xff0c;…

【JavaGuide面试总结】Java集合篇·中

【JavaGuide面试总结】Java集合篇中1.Collection 子接口之 SetComparable 和 Comparator 的区别比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同2.Collection 子接口之 QueueQueue 与 Deque 的区别ArrayDeque 与 LinkedList 的区别说一说 PriorityQueue3.Map 接口HashMap 的…

机器学习(八):深度学习简介

文章目录 深度学习简介 一、神经网络简介 二、深度学习各层负责内容 深度学习简介 一、神经网络简介 深度学习&#xff08;Deep Learning&#xff09;&#xff08;也称为深度结构学习【Deep Structured Learning】、层次学习【Hierarchical Learning】或者是深度机器学习【…