一、过滤器(Filter)简介

过滤器是对web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,主要可以拦截request和response

过滤器是以一种组件的形式与web程序绑定,采用链式进行工作。

过滤器的好处:

可以拦截请求和响应,以便查看或者获取客户端与服务器之间的交互数据,实现过滤的功能。另外过滤器可以动态的添加或删除而不需要修改web程序的逻辑。

过滤器的初始化和销毁都是通过Web容器来实现的,Web容器初始化Filter对象之后会执行init方法,销毁Filter对象之前会执行destory方法。

二、过滤器的使用

2.1、Filter基本使用

Servlet中Filter接口的定义如下:

public interfaceFilter {/**过滤器的初始化时被调用*/

public void init(FilterConfig filterConfig) throwsServletException;/**执行过滤器处理逻辑*/

public voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException;/**销毁过滤器时被调用*/

public voiddestroy();

}

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

如下自定义的过滤器:

public class LogFilter implementsFilter {/**初始化过滤器时调用*/

public void init(FilterConfig filterConfig) throwsServletException {

System.out.println("初始化过滤器");

}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throwsIOException, ServletException {

System.out.println("执行过滤器逻辑");//跳转到过滤器链路到下一个链路

chain.doFilter(request, response);

}public voiddestroy() {

System.out.println("销毁过滤器");

}

}

本文采用SpringBoot方式,Filter的配置类如下:

@BeanpublicFilterRegistrationBean initLogFilter(){

FilterRegistrationBean bean= newFilterRegistrationBean();

LogFilter filter= newLogFilter();

bean.setFilter(filter);//需要过滤的URL路径

List urls = new ArrayList();

urls.add("/manage/*");//只过滤 /manage/*的路径

bean.setUrlPatterns(urls);returnbean;

}

@BeanpublicFilterRegistrationBean initTimeFilter(){

FilterRegistrationBean bean= newFilterRegistrationBean();

TimeFilter filter= newTimeFilter();

bean.setFilter(filter);//需要过滤的URL路径

List urls = new ArrayList();

urls.add("/*");//过滤所有路径

bean.setUrlPatterns(urls);returnbean;

}

自定义过滤器需要实现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 implementsFilter {//...............

}

@WebFilter(urlPatterns = "/manage/*")

@Order(2)public class TimeFilter implementsFilter {//......

}

定义了两个Filter,其中LogFilter执行顺序为第一个,并且过滤所有请求;TimeFilter执行顺序为第二个,过滤 /manage/* 路径的请求

而@WebFilter注解是Servlet的注解,所以需要在启动类中加上Servlet注解的扫描注解 @ServletComponentScan,如下示:

@SpringBootApplication

@ServletComponentScanpublic classBootstrap

{public static voidmain( 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_Java Web之路一:过滤器(Filter)相关推荐

  1. NGINX发布支持动态配置的开源Web服务器

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ NGINX最近发布了NGINX Unit 1.0版.NGINX Unit是一种开源的Web和 ...

  2. Linux部署动态网页,Nginx发布支持动态配置的开源Web服务器

    NGINX最近发布了NGINX Unit 1.0版.NGINX Unit是一种开源的Web和应用服务,它支持远程配置和动态配置,使得配置上的更改不会对服务造成中断.Unit 1.0还支持在同一实例中运 ...

  3. Java学习笔记·ServletFilter过滤器配置实例(web.xml配置方法)

    准备一个Servlet(Lesson2/lesson6_2.Sample7.java) package lesson6_2;import java.io.*; import java.util.*; ...

  4. 专业Web前端路--启程

    仔细算算自己投入到IT行业工作中也有近四年的时间了(包括读研期间的实习),不得不感叹时光如箭.人的一生中总要有一个又一个的目标,由小到大,循序渐进,制定目标也要量体裁衣,正所谓知己知彼,百战不殆.我喜 ...

  5. 分布式动态配置后浪推前浪 -- Nacos

    ???? 前言 Nacos 是阿里巴巴的开源的项目,全称 Naming Configuration Service ,专注于服务发现和配置管理领域. Nacos 致力于帮助您发现.配置和管理微服务.N ...

  6. IdentityServer4-EF动态配置Client和对Claims授权(二)

    IdentityServer4-EF动态配置Client和对Claims授权(二) 原文:IdentityServer4-EF动态配置Client和对Claims授权(二) 本节介绍Client的Cl ...

  7. Quartz 在 Spring 中如何动态配置时间

    在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度. 有关调度的实现我就第一就想到了Quartz这个开源调度组件,因为很多项目使用过,Spring结合Quartz静态配置调度任务时间 ...

  8. 无法连接到已配置的开发web服务器_你知道多少种服务器?这三种服务器你都认识吗?...

    服务器是现实中常被讨论的设备之一,因为服务器与现代生活息息相关.按照服务器的用途,服务器可细分为诸多类别.为增进大家对服务器的了解程度,本文将对三种服务器予以介绍,它们分别是:Web服务器.应用程序服 ...

  9. Quartz 在 Spring 中如何动态配置时间--转

    原文地址:http://www.iteye.com/topic/399980 在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度.  有关调度的实现我就第一就想到了Quartz这个开 ...

最新文章

  1. CDataBaseEngineSink::OnRequestPlatformParameter 数据库异常:查询超时已过期 [ 0x80040e31 ]...
  2. C#强化系列:HttpModule,HttpHandler,HttpHandlerFactory简单使用
  3. 【线性代数公开课MIT Linear Algebra】 第二十三课 微分方程与exp(At)
  4. android华为虚拟截屏黑屏,Android截屏表面视图显示黑屏
  5. php环形链表,PHP环形链表实现方法示例
  6. Python爬虫之Scrapy框架结构
  7. Vue3 非常好用的中文文档以及一份 Vue 3 新文档学习笔记
  8. 激光导航技术是如何实现的?
  9. C语言中向量的加法,向量的加减法运算法则
  10. Java 小Q 世界上最遥远的距离 解法二
  11. C语言程序设计现代方法第二版,第八章课后编程题——第9题生成贯穿10乘10字符组的随机步法
  12. markdown中数学符号和公式总结
  13. [渝粤教育] 长安大学 互换性与技术测量 参考 资料
  14. 给俺的 CSDN 博客加背景音乐 - 高大尚的《心经》背景音乐
  15. 阿里云ECS CentOS 7 安装图形化桌面
  16. LD3320语音识别模块分析
  17. Dubbo源码解析(九)Dubbo系列 源码总结+最近感悟
  18. DepthwiseConv2D和Conv2D详解
  19. 教育系统APP(三)
  20. Python爬虫笔记三:微博登录(出师未捷身先死 长使英雄泪满襟)

热门文章

  1. 无人驾驶列车首次安全交付铁矿石,行程达280公里
  2. Go语言学习之旅--gorm(一)
  3. java-php-python-ssm流浪动物救助网站设计与实现计算机毕业设计
  4. MPEG4标准中的Advanced Simple Profile(ASP)完整的说明-03-4章
  5. Windows游戏设计(三)- 黑白棋游戏 - 使用Win32 SDK
  6. java毕业生设计租车管理系统计算机源码+系统+mysql+调试部署+lw
  7. H5移动端调取相机或相册
  8. iOS第三方集成之jpush极光推送
  9. 用python编写程序 ---简单的海龟作图
  10. JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0x9e 解决方案