前言

今天咱们来复习一下过滤器与拦截器吧,这是每一个Java程序员都要求掌握的技术,不许说不会哦,不会就赶紧学习,嘿嘿,咱们抓紧时间,现在就开始吧

1. 过滤器与拦截器的差异

过滤器和拦截器在功能上接近,但是他们有很大区别

1.过滤器可以修改request,而拦截器不能

2.过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境

3.过滤器不能调用IOC容器中的各种依赖,而拦截器可以

4.过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

2. 过滤器的作用描述

在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest。

根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。

在HttpServletResponse 到达客户端之前,拦截HttpServletResponse。

根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。

2.1 过滤器实现

要想使用Filter,需要写一个方法继承Filter类,我们写如下两个自己的Filter类,首先是FirstFilter类,其中@Order里边的数字越小代表越先被该Filter过滤,@WebFilter代表这是个Filter类并把这个类注入到容器中:

package com.example.executor_test.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;import org.springframework.core.annotation.Order;@Order(1)
@WebFilter(filterName="firstFilter", urlPatterns="/*")
public class FirstFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("first filter 1");chain.doFilter(request, response);System.out.println("first filter 2");}@Overridepublic void destroy() {}
}

然后是第二个Filter,SecondFilter类

package com.example.executor_test.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;import org.springframework.core.annotation.Order;@Order(2)
@WebFilter(filterName="secondFilter", urlPatterns="/*")
public class SecondFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("second filter 1");System.out.println("before:response" );chain.doFilter(request, response);System.out.println("after:response" );System.out.println("second filter 2");}@Overridepublic void destroy() {}
}

然后我们把Controller类也写出来吧:

package com.example.executor_test.controller;import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;import javax.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import com.example.executor_test.task.OldTask;
import com.example.executor_test.task.OldTaskThread;@RestController
public class TestController {@GetMapping("/test1")public String test1() {System.out.println("method in controller");return "test1";}}

最后是springboot的主方法入口,注意,由于我们使用注解注入的Filter,所以要在下边这个Application类中加入@ServletComponentScan注解:

package com.example.executor_test;import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext;import com.example.executor_test.task.OldTaskThread;@SpringBootApplication
@ServletComponentScan
public class ExecutorTestApplication {public static void main(String[] args) {  ConfigurableApplicationContext applicationContext = SpringApplication.run(ExecutorTestApplication.class, args);}
}

首先我们先来看一下执行结果,启动后访问127.0.0.1:8080/test1,在后台中打印如下信息:

first filter 1
second filter 1
before:response
method in controller
after:response
second filter 2
first filter 2

1.我们可以看出代码执行的流程,首先请求被firstfilter截获,打印出first filter 1

2.然后去执行chain.doFilter(request, response),这句话代表着请求会转发给过滤器链上下一个对象,也就是secondfilter,所以打印出secondfilter里的second filter 1

3.接下来再执行secondfilter里的chain.dofilter()方法,请求再转发给下一个对象,由于没有其他的filter了,所以会转发给controller,打印出了controller类中的method in controller

4.接下来再去内存栈里调用secondfilter的print(“second filter 2”),然后再去内存栈里调用firstfilter的print(“first filter 1”)

所以如果在自己实现的Filter类的doFilter方法里不加chain.doFilter(req, rep)是万万不行的,那样会导致请求到了这个filter里就不再往下走,永远进不了controller中

过滤器、拦截器简单流程及使用相关推荐

  1. SpringBoot的过滤器拦截器AOP和异常处理器

    目录 前言 过滤器 创建过滤器 拦截器 创建拦截器 配置拦截器 AOP 创建AOP 异常处理器 创建异常处理器 测试请求的执行过程 创建接口 发送请求 前言 过滤器.拦截器.AOP.异常处理器是搭建系 ...

  2. 过滤器 拦截器 区别

    转 http://www.cnblogs.com/wangyuyu/archive/2013/07/02/3167354.html 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过 ...

  3. 获取http请求标头_HTTP请求和标头参数的CDI拦截器–简单示例

    获取http请求标头 在使用Java EE开发和发展REST API的过程中,有些情况下您希望以更精细的方式(视情况)对传入的HTTP请求(特别是标头参数)进行"观察" Servl ...

  4. HTTP请求和标头参数的CDI拦截器-简单示例

    在使用Java EE开发和发展REST API的过程中,有些情况下您希望以更细粒度的方式(视情况而定)对传入的HTTP请求(特别是标头参数)进行"观察" Servlet过滤器或更具 ...

  5. Spring MVC 拦截器执行流程

    Spring MVC-拦截器 今天就是把有关拦截器的知识做一个总结. 1.拦截器概述 1.1 什么是拦截器? Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(F ...

  6. java web 过滤器 拦截器 监听器_Java中的拦截器和过滤器,可不是同一个东西

    过滤器(Filter) 过滤器就如上面的水质过滤器一样,把管道中的水进行一遍过滤再使用.过滤器基于filter接口中的doFilter回调函数,主要的用途是设置字符集.控制权限.控制转向.做一些业务逻 ...

  7. Struts2拦截器简单示例

    拦截器(Interceptor)是Struts 2的核心组成部分.很多功能(Feature)都是构建在拦截器基础之上的,例如文件的上传和下载.国际化.转换器和数据校验等,Struts 2利用内建的拦截 ...

  8. springMVC 拦截器简单配置

    在spring 3.0甚础上,起来越多的用到了注解,从前的拦截器在配置文件中需要这样配置 [html] view plaincopy <beans...> ... <bean id= ...

  9. 手机WIFI拦截器简单实现

    最近,经理给了一个需求,让写一个WIFI拦截器,一开始我也是毫无头绪,不过还是几个小时就搞定了,其实也并没有什么,就是一个简单的广播和服务,上代码: 1.先看一下目录结构: 2.首先你要把你的APP得 ...

最新文章

  1. (1)学习数组,集合,IEnumerable接口,引申学习迭代器
  2. python word转pdf
  3. 零基础自学python的app-零基础初学Python,需要装什么软件?
  4. 毕加索发布轻量化转化引擎及BIMSOP协作云平台
  5. Scala入门到精通—— 第二节Scala基本类型及操作、程序控制结构
  6. TCP包头、UDP包头、IP包头、和MAC帧包头详细字段和包头大小
  7. 与python相关计算机基础知识
  8. Google | 突破瓶颈,打造更强大的Transformer
  9. java 重力脚本_Java中非常简单的脚本解析器
  10. 2021-2025年中国车轮运动防护产品行业市场供需与战略研究报告
  11. 路由模式 -- ADSL账号密码拨号
  12. it营Typescript学习笔记02(基础完结)模块,命名空间,装饰器
  13. DSP 增强型脉宽调制ePWM
  14. scala either_使用Either和Option处理功能错误
  15. SSL常见错误及解决方法
  16. 如何搭建用户体验指标体系?
  17. 用Python找101-200之间的素数
  18. 【爬虫篇】《极客Python之效率革命》(小甲鱼) b站笔记
  19. consul-agent
  20. 从苏宁电器到卡巴斯基(后传)第01篇:讲讲我写完那36篇故事之后的一些事

热门文章

  1. JVM虚拟机(3)_设置栈内存大小
  2. 2013年电子商务部工作总结之搜索引擎
  3. 【AI测试】智能音箱--自然语言处理,语音语义识别测试
  4. [K8S] 环境变量获取
  5. CocosCreator之KUOKUO带你做BMFont中文游戏字体
  6. uniapp根据经纬度绘制地图定位(APP端)
  7. Pytorch线性回归的详细实现
  8. 浏览器的链接不是专属连接,有可能是https被拦截了
  9. Java重载与返回值
  10. 如何用MAC上的Safari检查iPhone手机App运行的Html页面