拦截器、过滤器、监听器

news2024/11/28 0:38:07

目录

  • 一、拦截器
    • 1. 拦截器是什么?
    • 2. 设置拦截器
      • a. 定义拦截器
      • b. 配置加载拦截器
      • c. 新建页面
  • 二、过滤器
    • 1. 使用原因
    • 2. Filter概念图
    • 3. Filter编程
  • 三、监听器

一、拦截器

拦截器:必须保证页面有访问controller的操作,否则拦截不了

1. 拦截器是什么?

  1. 概念:拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。
  2. 作用:在指定的方法调用预先设定的代码(preHandle、postHandle、afterCompletion)
  3. 使用:拦截controller的请求
    在这里插入图片描述

2. 设置拦截器

a. 定义拦截器

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:异常对象
@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...");
    }
}

b. 配置加载拦截器

方式一:可以继承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/**");//放行静态资源和登陆资源; 
          
    }
}

c. 新建页面

方式一:我们可以查看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. 使用原因

  • 在一个比较复杂的Web应用程序中,通常都有很多URL映射,对应的也会有多个Servlet来处理URL。现将各个Servlet设计功能如下:
  • 其中,ProfileServlet、PostServlet和ReplyServlet都需要用户登录后才能操作,否则,应当直接跳转到登录页面。
  • 我们可以直接把判断登录的逻辑写到这3个Servlet中,但是,同样的逻辑重复3次没有必要,并且,如果后续继续加Servlet并且也需要验证登录时,还需要继续重复这个检查逻辑。
  • 为了把一些公用逻辑从各个Servlet中抽离出来,JavaEE的Servlet规范还提供了一种Filter组件,即过滤器,它的作用是,在HTTP请求到达Servlet之前,可以被一个或多个Filter预处理,类似打印日志、登录检查等逻辑,完全可以放到Filter中。
    在这里插入图片描述

2. Filter概念图

在这里插入图片描述

3. Filter编程

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>CharacterEncodingFilter</filter-name>
       <filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
   </filter>
   <filter-mapping>
       <filter-name>CharacterEncodingFilter</filter-name>
       <!--只要是 /servlet的任何请求,会经过这个过滤器-->
       <url-pattern>/servlet/*</url-pattern>
       <!--<url-pattern>/*</url-pattern>-->
       <!-- 别偷懒写个 /* -->
   </filter-mapping>

3. 过滤器代码

      public class CharacterEncodingFilter implements Filter {
      
          //初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
          public void init(FilterConfig filterConfig) throws ServletException {
              System.out.println("CharacterEncodingFilter初始化");
          }
      
          //Chain : 链
          /*
          1. 过滤中的所有代码,在过滤特定请求的时候都会执行
          2. 必须要让过滤器继续同行
              chain.doFilter(request,response);
           */
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
              request.setCharacterEncoding("utf-8");
              response.setCharacterEncoding("utf-8");
              response.setContentType("text/html;charset=UTF-8");
      
              System.out.println("CharacterEncodingFilter执行前....");
              chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!
              System.out.println("CharacterEncodingFilter执行后....");
          }
      
          //销毁:web服务器关闭的时候,过滤器会销毁
          public void destroy() {
              System.out.println("CharacterEncodingFilter销毁");
          }
      }

运行结果:首先检测URL是符合过滤器的Servlet映射,如果符合就过滤,即执行过滤器代码。
在这里插入图片描述

三、监听器

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

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

相关文章

OpenWrt软路由空间扩容

文章目录预备知识OpenWrt系统固件分类EXT4固件扩容方式新建分区扩容操作步骤直接扩容操作步骤SQUASHFS固件扩容方式新建分区扩容直接扩容EFI引导固件的额外操作参考预备知识 OpenWrt系统固件分类 EXT4固件 固件包名称中包含有ext4关键字&#xff0c;可以参考固件分类关键字示意…

设计模式 - 创建型模式_建造者模式

文章目录创建型模式概述Case模拟工程Bad ImplBetter Impl &#xff08;建造者模式重构代码&#xff09;小结创建型模式 创建型模式提供创建对象的机制&#xff0c; 能够提升已有代码的灵活性和可复⽤性。 类型实现要点工厂方法定义⼀个创建对象的接⼝&#xff0c;让其⼦类⾃⼰…

编写用户注册用表单

<!-- 需求&#xff1a; 用户注册&#xff1a;用户名、密码、确认密码、性别、兴趣爱好、学历、简介 --> <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>编写用户注册用表单<…

【Linux】Linux和Window下\r与\n的区别、git命令行的使用

作者&#xff1a;小卢 专栏&#xff1a;《Linux》、《Git》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 1. 回车换行符在Window下和在Linux下的区别&#xff1a; 1.1回车换行符&#xff1a;…

用友U8和旺店通企业版淘宝奇门单据接口集成

用友U8和旺店通企业奇门单据接口集成对接系统&#xff1a;旺店通企业奇门慧策最先以旺店通ERP切入商家核心管理痛点——订单管理&#xff0c;之后围绕电商经营管理中的核心管理诉求&#xff0c;先后布局流量获取、会员管理、仓库管理等其他重要经营模块。慧策的产品线从旺店通E…

实现宏offsetof()

本期介绍&#x1f356; 主要介绍&#xff1a;什么是offsetof()&#xff0c;offsetof()的用法&#xff0c;如何自己实现这个宏&#x1f440;。 offsetof其实是一个宏&#xff0c;作用是&#xff1a;能够求出指定成员相对于结构体起始地址的偏移量&#xff08;单位&#xff1a;字…

(考研湖科大教书匠计算机网络)第三章数据链路层-第一节:数据链路层概述

文章目录一&#xff1a;数据链路层概述&#xff08;1&#xff09;为什么要有数据链路层&#xff08;2&#xff09;数据链路层定义&#xff08;3&#xff09;点对点信道和广播信道二&#xff1a;数据链路层需要解决的一些问题&#xff08;1&#xff09;三个最基本问题①&#xf…

深入理解Promise之一步步教你手写Promise构造函数

目录前言一&#xff0c;手写教学1.1 基本结构1.2 resolve与reject结构搭建1.3 resolve与reject代码实现1.4 throw抛出异常改变状态1.5 promise对象状态只能转换一次1.6 then方法进行回调1.7 异步任务的回调执行1.8 执行多个回调的实现1.9 同步修改状态then方法结果返回1.10 异步…

【手写 Promise 源码】第四篇 - 翻译并理解 Promise A+ 规范

一&#xff0c;前言 上一篇&#xff0c;根据对 Promise 的分析和了解&#xff0c;实现了一个简版 Promise&#xff0c;主要涉及以下内容&#xff1a; Promise 的实现思路&#xff1b;Promise A 规范&#xff08;简版&#xff09;&#xff1b;Promise 简版实现和功能测试&…

KVM虚拟化之小型虚拟机kvmtool的使用记录

根据 kvmtool github仓库文档的描述&#xff0c;类似于QEMU&#xff0c;kvmtool是一个承载KVM Guest OS的 host os用户态虚拟机&#xff0c;作为一个纯的完全虚拟化的工具&#xff0c;它不需要修改guest os即可运行, 不过&#xff0c;由于KVM基于CPU的硬件虚拟化支持&#xff0…

读《哲学的故事》

文章目录读《哲学的故事》&#x1f6a9; 遇见&#x1f33b; 简述&#x1f33e; 部分摘抄读《哲学的故事》 一本书读过后&#xff0c;我有种脑子里又被塞进了很多新东西的感觉&#xff0c;也有种想要自我抒发、宣泄的欲望。可真到要说的时候&#xff0c;又好像无话可说。总归勉…

Java转换流(InputStreamReader/OutputStreamWriter)

文章目录概述为什么会有转换流&#xff1f;InputStreamReaderOutputStreamWriter概述 转换流是字节流到字符流的桥梁&#xff0c;在转换的过程中&#xff0c;可以指定编码。转换流也是一种处理流&#xff0c;它提供了字节流和字符流之间的转换。 转换流的两个类 InputStreamR…

1.设计模式的前奏

哪些维度评判代码质量的好坏&#xff1f; 常用的评价标准 可维护性&#xff08;maintainability&#xff09;:维护代码的成本可读性&#xff08;readability&#xff09;可扩展性&#xff08;extensibility&#xff09;&#xff1a;码应对未来需求变化的能力灵活性&#xff0…

【keepass】密码管理软件-推荐插件和相关工具合集-keepass工作流分析(自动填充、美化界面、快速添加记录、安全增强、软件和数据库维护类)

Keepass有很多已经开源的插件&#xff0c;生态良好&#xff0c;在官网有专门的插件推荐区。安装插件的方法很简单&#xff0c;直接把下载好的插件文件放在plugins文件夹内&#xff0c;重启软件即可。下面我以几大功能推荐一些keepass插件或搭配使用的浏览器扩展&#xff0c;以求…

Coolify系列-手把手教学解决局域网局域网中的其他主机访问虚拟机以及docker服务

背景 我在windows电脑安装了一个VM&#xff0c;使用VM开启了Linux服务器&#xff0c;运行docker&#xff0c;下载服务镜像&#xff0c;然后运行服务,然后遇到了主机无法访问服务的问题。 问题排查 STEP1:首先要开启防火墙端口&#xff0c;这个我的Coolify系列其他文章有详细…

【c++】设置控制台窗口字体颜色和背景色(system和SetConsoleTextAttribute函数 )(内含超好玩的c++游戏链接)

目录 游戏推荐 研究初步 SetConsoleTextAttribute函数 原型 参数 举个栗子 最后 题外话 一篇游戏笔记。。。 游戏推荐 最近&#xff0c;在玩&#xff08;完&#xff09;一个c的控制台游戏。 啊&#xff0c;真的非常好玩。虽然是一个文字游戏&#xff0c;但有很多隐…

分享137个ASP源码,总有一款适合您

ASP源码 分享137个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 137个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/13nF0yADJhSBonIFUIoymPQ?pwdmsl8 提取码&#x…

【C++】位图、布隆过滤器概念与模拟实现

目录 一、位图 1.1 位图的概念 1.2 位图的使用 1.3 位图的实现 1.4 位图的应用 二、布隆过滤器 2.1 布隆过滤器 2.2 布隆过滤器的实现 2.3 布隆过滤器练习题 一、位图 1.1 位图的概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数据&am…

监控Python 内存使用情况和代码执行时间

我的代码的哪些部分运行时间最长、内存最多&#xff1f;我怎样才能找到需要改进的地方&#xff1f;” 在开发过程中&#xff0c;我很确定我们大多数人都会想知道这一点&#xff0c;而且通常情况下存在开发空间。在本文中总结了一些方法来监控 Python 代码的时间和内存使用情况…

【24】C语言 | 调试技巧

目录 1、调试概念&#xff1a; 2、Debug和Release的介绍 3、windows中的快捷键 4、案例一&#xff1a;求1&#xff01; 2&#xff01;3&#xff01;...n&#xff01; 5、案例二&#xff1a;下面的代码输出什么&#xff1f; 6、案例三&#xff1a;实现一个strcopy的函数 …