一、过滤器(Filter)简介

过滤器是对web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,主要可以拦截request和response
过滤器是以一种组件的形式与web程序绑定,采用链式进行工作。
 
过滤器的好处:
可以拦截请求和响应,以便查看或者获取客户端与服务器之间的交互数据,实现过滤的功能。另外过滤器可以动态的添加或删除而不需要修改web程序的逻辑。
 
过滤器的初始化和销毁都是通过Web容器来实现的,Web容器初始化Filter对象之后会执行init方法,销毁Filter对象之前会执行destory方法。
 
二、过滤器的使用
2.1、Filter基本使用
Servlet中Filter接口的定义如下:
public interface Filter {

    /**过滤器的初始化时被调用*/
public void init(FilterConfig filterConfig) throws ServletException; /**执行过滤器处理逻辑*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException; /**销毁过滤器时被调用*/
public void destroy(); }

其中init方法是在Filter初始化时会被调用、destroy方法是Filter被销毁时调用,而doFilter方法是过滤器的工作时执行的方法,doFilter至少需要保护两块逻辑,一个是当前过滤器需要处理的过滤逻辑,一个是跳转到下一个过滤器中。

如下自定义的过滤器:

public class LogFilter implements Filter {

    /**初始化过滤器时调用*/
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化过滤器");
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("执行过滤器逻辑");
//跳转到过滤器链路到下一个链路
chain.doFilter(request, response);
} public void destroy() {
System.out.println("销毁过滤器");
}
}
本文采用SpringBoot方式,Filter的配置类如下:
    @Bean
public FilterRegistrationBean initLogFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
LogFilter filter = new LogFilter();
bean.setFilter(filter);
//需要过滤的URL路径
List<String> urls = new ArrayList<String>();
urls.add("/manage/*");//只过滤 /manage/*的路径
bean.setUrlPatterns(urls);
return bean;
} @Bean
public FilterRegistrationBean initTimeFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
TimeFilter filter = new TimeFilter();
bean.setFilter(filter);
//需要过滤的URL路径
List<String> urls = new ArrayList<String>();
urls.add("/*");//过滤所有路径
bean.setUrlPatterns(urls);
return bean;
} 
自定义过滤器需要实现Filter接口,重写Filter接口的三个方法,然后配置Filter即可,项目启动时会执行init方法,项目关闭时会执行destory方法,客户端每次发起请求都会执行一次doFilter方法,doFilter必须执行chain.doFilter方法将请求转发到下一个过滤器,
否则最终的请求就无法达到业务层逻辑,多个Filter的执行顺序和配置的执行顺序一样,先配置的就先执行,也可以手动设置不同的Filter的执行顺序,理论上各个Filter直接是相互独立的。 
 
2.2、Filter的进阶使用
实战情况下不同的Filter需要过滤的路径可能不一样,可以通过设置不同的Filter过滤不同的路径,如上例中LogFilter只拦截 /manage/* 路径的请求,而TimeFilter会过滤所有的请求;
另外除了过滤的路径,不同的Filter也可以手动设置不同的执行顺序,可以通过@Order注解来设置,而且Spring还提供了@WebFilter注解可以直接定义Filter,而不需要单独再用@Bean注解来定义,用法如下:
@WebFilter(urlPatterns = "/*")
@Order(1)
public class LogFilter implements Filter { //............... }
@WebFilter(urlPatterns = "/manage/*")
@Order(2)
public class TimeFilter implements Filter { //...... }
定义了两个Filter,其中LogFilter执行顺序为第一个,并且过滤所有请求;TimeFilter执行顺序为第二个,过滤 /manage/* 路径的请求
而@WebFilter注解是Servlet的注解,所以需要在启动类中加上Servlet注解的扫描注解 @ServletComponentScan,如下示:
@SpringBootApplication
@ServletComponentScan
public class Bootstrap
{
public static void main( String[] args )
{
SpringApplication.run(Bootstrap.class);
}
}

三、Filter的实现原理

Filter和Servlet一样都是通过Web容器实现的,Web容器分别存了Servlet和Filter的两个Map,key是对应配置的路径url-parttern,value分别就是Servlet和Filter的实例

在web容器启动时就会初始化所有的Filter,并且将所有的Filter存入Map中,每次当有客户端请求来时,web容器都会先获取请求的url,然后遍历所有的Filter,如果Filter满足URL的条件,就将Filter加入到过滤器数组中。

然后将过滤器数组中的所有过滤器组成过滤器链,挨个执行过滤器的逻辑。

 
 
 
 
 
 
 
 
 
 
 
 

Java Web之路一:过滤器(Filter)的更多相关文章

  1. [原创]java WEB学习笔记44:Filter 简介,模型,创建,工作原理,相关API,过滤器的部署及映射的方式,Demo

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. Java Web三大组件之过滤器(Filter)

    什么是过滤器?有什么用? 过滤器JavaWeb三大组件之一,它与Servlet很相似.不过滤器是用来拦截请求的,而不是处理请求的.过滤,顾名思义,就是留下我们想要的,丢掉我们不需要的.例如:某个网站的 ...

  3. java web学习总结(十七) -------------------过滤器

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  4. JAVA Web项目的编码过滤器

    首先写一个EncodeFilter的过滤类: package com.djtu.wy.common; import java.io.IOException;import javax.servlet.F ...

  5. JAVA WEB 解决编码问题的filter

    最近使用Springmvc,GET传输参数的时候,经常出错误,下面介绍添加一个Filter的方法,可以解决这个问题.既支持POST方式也支持GET方式. 首先写一个Filter package com ...

  6. 我的java web之路(配置开发环境)

    这个学期学习java web开发,当然不能只靠上机的时间来练习,于是,便在自己的电脑上安装一系列的软件... 1.JDK的安装.首先,下载Java JDK,可以到sun公司网站下载.一定要下载适合自己 ...

  7. java web.xml listener servlet 和filter加载顺序

    在该项目中总会遇到一些关于加载的优先问题.最近遇到了同样的类别似的,所以,如果你发现信息汇总下,以下是转载其他一些人,毕竟,人们写的不错.它不重复创建的轮.只是略作修改自己的观点. 首先能够肯定的是, ...

  8. java web 拦截器、过滤器理解

    1.首先要明确什么是拦截器.什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加 ...

  9. JAVA WEB项目中开启流量控制Filter

    Flow Control:控流的概念 主要是用来限定server所能承载的最大(高并发)流量峰值,以免在峰值是Server过载而宕机,对于WEB系统而言 通常是分布式部署,如果请求并发量很大,会导致整 ...

随机推荐

  1. [Inno Setup] 退出安装程序的两种方式

    1. 完全静默的退出 procedure ExitProcess(exitCode:integer); external 'ExitProcess@kernel32.dll stdcall'; ... ...

  2. eclipse 创建maven项目失败

    问题描述: eclipse 初次创建maven项目报错 可能是maven-archetype-quickstart:1.1.jar 包失效了或者没有? 有人说把这个jar包放在maven本地仓库里 我 ...

  3. 《Java 开发从入门到精通》—— 2.3 使用IDE工具序

    本节书摘来异步社区<Java 开发从入门到精通>一书中的第2章,第2.3节,作者: 扶松柏 , 陈小玉,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.3 使 ...

  4. codeforces 1287A -Angry Students(模拟)

    It's a walking tour day in SIS.Winter, so t groups of students are visiting Torzhok. Streets of Torz ...

  5. 24-Java-Spring框架(二)

    Spring框架的了解.SpringIOC的部分内容请阅读23-Java-Spring框架(二) 三.Spring Web MVC(Model View Controller) 1.SpringMVC ...

  6. IoTClient开发6 - S7-200SmarTcp协议客户端实现

    环境和工具 服务端电脑IP:192.168.1.130 客户端电脑IP:192.168.1.120 1.在服务端电脑运行IoTClientTool 2.运行Wireshark 3.在客户端电脑运行Io ...

  7. 去 HBase,Kylin on Parquet 性能表现如何?

    Kylin on HBase 方案经过长时间的发展已经比较成熟,但也存在着局限性,因此,Kyligence 推出了 Kylin on Parquet 方案(了解详情戳此处).通过标准数据集测试,与仍采 ...

  8. ASR6505带MCU STM8L+SX1262内核LoRa芯片

    LoRa是Semtech公司采用和推广的一种基于扩频技术的超远距离无线传输方案.一种简单的能实现远距离.长电池寿命.大容量的系统,进而扩展传感网络,LoRaWAN,LinkWAN,MESH组网,自组网 ...

  9. Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序

    分析以下需求,并用代码实现 1.定义一个长度为10的int数组,并存入10个int类型的数据,其中有一些数据是重复的 2.利用集合的知识对数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序 3 ...

  10. 转载-git使用之忽略不需要上传的文件的几种方式

    在我们使用git 的时候通常会遇到一些问题,一些文件我创建了但是我并不想上传或者有些文件我修改了但是并不想上传(为了适应个自己的开发环境),但是在每次git status的时候总能看到它,不仅感到很心 ...