1._Filter

JavaWeb三大组件(Servlet,Filter,Listener)之一;

与Servlet类似,用来拦截请求,不是用来处理请求的;WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。

执行地位在Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时,会根据执行流程再次反向执行Filter。可以解决多个Servlet共性代码的冗余问题(例如:乱码处理、登录验证)

2._Filter的生命周期

init在服务器启动时会创建Filter实例,并且每个类型的Filter只创建一个实例,从此不再创建,在创建完Filter实例后,会马上调用init()方法完成初始化工作,这个方法只会被执行一次;

doFilter:这个方法会在用户每次访问目标资源(web.xml文件配置Filter的url-pattern中的路径)时执行,如果需要“放行”,那么需要调用FilterChain的doFilter(ServletRequest,ServletResponse)方法,如果不调用FilterChain的doFilter()方法,那么目标资源将无法执行;

destroy :服务器会在创建Filter对象之后,把Filter放到缓存中一直使用,通常不会销毁它。一般会在服务器关闭时销毁Filter对象,在销毁Filter对象之前,服务器会调用Filter对象的destory()方法。

修改TestFilter的代码,进行测试

public class TestFilter implements Filter {public void init(FilterConfig config) throws ServletException {System.out.println("init...");}public void destroy() {System.out.println("destroy...");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {System.out.println("filter....");chain.doFilter(request, response);}
}

3._Filter的配置

Filter的配置和Servlet的配置类似,分为xml和注解两种配置方式。

1,xml配置

注意和 servlet区分

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><filter><!-- filter的名字,必须和另一组标签中的filter的名字一致 --><filter-name>TestFilter</filter-name><!-- filter的全类名 --><filter-class>com.qfedu.filter.TestFilter</filter-class></filter><filter-mapping><!-- filter的名字,必须和另一组标签中的filter的名字一致 --><filter-name>TestFilter</filter-name><!-- 被filter拦截的资源 --><url-pattern>/TestServlet</url-pattern></filter-mapping>
</web-app>

2,注解配置

在自定义的Filter类上使用注解@WebFilter,注解常用属性:

  • filterName:filter的名字;
  • value:过滤的目标资源的地址。

如果@WebFilter只写了字符串,这个字符串Filter过滤目标资源的地址。

@WebFilter(filterName = "AFilter", value = "/AServlet")
public class AFilter implements Filter {public void init(FilterConfig config) throws ServletException {}public void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {System.out.println("AFilter...");chain.doFilter(request, response);}
}

3,过滤器路径

过滤器的过滤路径通常有三种形式:

  • 精确过滤匹配 ,比如/index.jsp/myservlet1
  • 后缀过滤匹配,比如*.jsp*.html*.jpg
  • 通配符过滤匹配/*,表示拦截所有。注意过滤器不能使用/匹配,/aaa/bbb/*允许。

4,过滤器链

客户端对服务器请求之后,服务器调用Servlet之前会执行一组过滤器(多个过滤器),那么这组过滤器就称为一条过滤器链。

每个过滤器实现某个特定的功能,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则Web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

5,过滤器优先级

在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。 优先级:

  • 如果为注解的话,是按照类全名称的字符串顺序决定作用顺序;
  • 如果web.xml,按照 filter-mapping注册顺序,从上往下
  • web.xml配置高于注解方式;
  • 如果注解和web.xml同时配置,会创建多个过滤器对象,造成过滤多次。

关于“注解和web.xml同时配置,会创建多个过滤器对象,造成过滤多次”

4._ 基本使用

1,创建javaweb项目

2, 创建过滤器类

@WebFilter(filterName = "AFilter", value = "/AServlet")
public class AFilter implements Filter {public void init(FilterConfig config) throws ServletException {}public void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {System.out.println("AFilter...");chain.doFilter(request, response);}
}

3,创建被过滤的类

@WebServlet(name = "AServlet", value = "/AServlet")
public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("doGet...");}
}

启动项目,访问 http://localhost:8080/javaweb__01_war_exploded/AServlet,会先打印出"AFilter..."然后才会执行对应的类,打印出doGet...

【Filter】基础知识相关推荐

  1. Filter基础知识

    一.简介 作用:对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理的前后实现一些特殊的功能. 过滤器 API:Filter,FilterChain,FilterCo ...

  2. java培训基础知识都学哪些

    很多人都开始学习java技术,觉得java语言在未来的发展前景空间非常大,事实却是如此,那么针对于零基础的同学, 学习java技术需要学哪些呢?下面我们就来看看java培训基础知识都学哪些? java ...

  3. Spark基础知识解答

    Spark基础知识解答 一. Spark基础知识 1. Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架. Spark基于mapred ...

  4. 你觉得什么才是 Java 的基础知识?

    近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...

  5. 2021 版 Spring Boot 基础知识复习手册(2w字,建议收藏)

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

  6. linux 基础知识及命令总结

    1.mkdir   创建目录 -p 创建多级目录  mkdir -p /data/test -m, --mode=模式 设置权限模式(类似chmod),而不是rwxrwxrwx 减umask -p, ...

  7. Spring集成基础知识

    本文是我们名为" EAI的Spring集成 "的学院课程的一部分. 在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们. 接下来,您将深 ...

  8. html css基础知识

    1 这是自己学习html时候做的一些记录,供大家参考 <!-- 2 块和内联3 块元素:独占一行的元素4 div p h ul5 div没有任何语义,就是一个纯粹的快元素6 就是为了方便布局7 ...

  9. JAVA基础知识|lambda与stream

    lambda与stream是java8中比较重要两个新特性,lambda表达式采用一种简洁的语法定义代码块,允许我们将行为传递到函数中.之前我们想将行为传递到函数中,仅有的选择是使用匿名内部类,现在我 ...

  10. python历史以及基础知识

    1. Python 基础知识 1.1 Python 历史 1.1.1 Python 起源 Python 的作者,Guido von Rossum,荷兰人.1982 年,Guido 从阿姆斯特丹大学 获 ...

最新文章

  1. maven的配置-2019-4-13
  2. python中getrandbits函数用法_python random - 刘江的python教程
  3. 实验1c语言开发环境使用和数据类型、运算符和表达式
  4. Chrome之控制台使用【转载】
  5. Bailian3244 跳水比赛【水题】
  6. python3第一次作业
  7. C# 类2010-11-07
  8. 《JAVA并发编程实践JavaConcurrencyinPractice-中文-高清-带书签-完整版(Doug Lea)》
  9. p5.js之“列阵绘图画板”实现大面积规律性绘制
  10. DCT变换(JAVA)
  11. python 插值 —— 如何实现插值,以及错误ValueError: A value in x_new is below the interpolation range.
  12. c语言硬件控制程序,msp430的一些常用的C语言控制程序---ZLG7289
  13. 小白傻瓜式ChatGPT免费使用教程详细教学
  14. 一段php代码,请问一段PHP代码是什么意思?
  15. linux系统及应用ppt下载地址,[计算机软件及应用]Linux操作系统.ppt
  16. HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
  17. Python的下标如何获取
  18. 【STC89C52】学习51单片机的必备电子电路知识基础
  19. 数据分析-回归分析读书笔记
  20. Word文档如何进行加密操作

热门文章

  1. 简单易懂的排序算法演示
  2. Leetcode: Reorder List Summary: Reverse a LinkedList
  3. 如何将以字符表示的16进制数转换为机器码表示的16进制数
  4. MaxEnt: 最大熵模型(Maximum Entropy Models)(一)
  5. 孙鑫VC学习笔记:第九讲 界面修改,工具栏,状态栏,启动画面的制作
  6. 拓端tecdat|R语言解决最优化问题-线性规划(LP)问题
  7. 使用Lingo做灵敏度分析
  8. 图像分类模型AlexNet解读
  9. Caffe傻瓜系列(5):Blob,Layer and Net以及对应配置文件的编写
  10. python求解括号匹配的相关问题