一、Filter 概述

  1、概念

    Filter 过滤器是 JavaWeb 的三大组件之一。(Servlet、Filter、Listener)

    Filter 过滤器它是 JavaEE 的规范,可以在浏览器以及目标资源之间起到一个过滤的作用,它的作用是:拦截请求,过滤响应。

    web 中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

  2、作用

    拦截请求常见的应用场景有:

      ① 登录验证;

      ② 权限检查;

      ③ 事务管理;

      ④ 统一编码处理;

      ⑤ 敏感字符等等

二、使用步骤

  1、定义一个类,实现接口 Filter

  2、实现 doFilter() 方法

  3、配置拦截路径

    ① web.xml 配置

      格式:

 <!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
<!--给 filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置 filter 的全类名-->
<filter-class>com.atguigu.filter.AdminFilter</filter-class>
</filter>
<!--filter-mapping 配置 Filter 过滤器的拦截路径-->
<filter-mapping>
<!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
<filter-name>AdminFilter</filter-name>
<!--  url-pattern 配置拦截路径,可以有多个拦截路径
/ 表示请求地址为: http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
/admin/* 表示请求地址为: http://ip:port/工程路径/admin/*
-->
<url-pattern>/admin/*</url-pattern>
<url-pattern>/client/*</url-pattern>
</filter-mapping>

    ② 注解方式配置

       在类上添加 @WebFilter() 即可,里面填写访问所要拦截的资源的路径。

  4、代码实现

 import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException; @WebFilter("/*")
public class FirstFilter implements Filter {
public void destroy() {
}
// doFilter 方法,专门用于拦截请求,过滤响应
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("filterDemo1被执行了....");
// 放行操作
chain.doFilter(req, resp);
} public void init(FilterConfig config) throws ServletException { } }

  5、Filter 的工作流程图

    

三、Filter 的生命周期

  Filter 的生命周期包含几个方法:

  1、构造器方法

      执行时机:在 web 工程启动的时候执行(Filter 会创建)

  2、init 初始化方法

      执行时机:在 web 工程启动的时候,构造方法执行完,立刻执行 init 方法,做一些初始化的操作

  3、doFilter 方法

      执行时机:每次访问目标资源时都会调用,每次拦截到请求,就会执行(执行多次);

  4、destroy 方法

      执行时机:停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器),用来释放资源

四、Filter 接口

   Filter 是一个接口,给我们提供了下面三个方法

   

   Filter 接口,实现 Filter 需要实现该接口。

    (1)init() 方法用于初始化 Filter;

    (2)doFilter() 是过滤请求和响应的主要方法;

    (3)destory() 用于在 Filter 对象被销毁前做收尾工作,如是否资源等;

五、FilterConfig 类

  FilterConfig 类是 Filter 过滤器的配置文件类。

  

  Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里面包含了 Filter 配置文件的配置信息。

  FilterConfig 对象在服务器调用 init() 方法时传递进行。

  FilterConfig 类的作用是获取 filter 过滤器的配置内容:

getFilterName():获取 Filter 的名称 filter-name 的内容;

getSerletContext():获取ServletContext 对象(即 application)

getInitParameter():获取在 Filter 中配置的 init-param 初始化参数;

getInitParameterNames():获取所有初始化参数的名字;

   Demo:

 web.xml 的配置:
<!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
<!--给 filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置 filter 的全类名--><filter-class>com.atguigu.filter.AdminFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost3306/test</param-value>
</init-param>
</filter> Filter 代码:
public void init(FilterConfig filterConfig) throws ServletException { // 1、 获取 Filter 的名称 filter-name 的内容
System.out.println("filter-name 的值是: " + filterConfig.getFilterName()); // 2、 获取在 web.xml 中配置的 init-param 初始化参数
System.out.println("初始化参数 username 的值是: " + filterConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是: " + filterConfig.getInitParameter("url")); // 3、 获取 ServletContext 对象
System.out.println(filterConfig.getServletContext());
}

六、FilterChain 过滤器链

    FilterChain 对象是在 doFilter() 方法被调用时作为参数传递进来的。

    

    doFilter() 方法用于调用 Filter 链上的下一个过滤器,如果当前过滤器为最后一个,过滤器则将请求发送到目标资源。

    FilterChain 过滤器链(多个过滤器如何一起工作)  

  (1)执行顺序:如果有两个过滤器:过滤器1和过滤器2

           ① 过滤器1前置代码

       ② 过滤器2前置代码

       ③ 资源执行 doFilter()

       ④ 过滤器2 后置代码

       ⑤ 过滤器1 后置代码

  (2)过滤器先后顺序问题

       ① 注解配置:

        规则:按照类名的字符串比较规则比较,值小的先执行。

        如: AFilter 和 BFilter,AFilter就先执行了。

       ② web.xml 配置:

        规则: 按照 <filter-mapping> 的顺序决定的,如果定义的位置越靠前,越先被调用;

  (3)多个 Filter 过滤器执行的特点

      ① 所有 Filter 和目标资源默认都执行在同一个线程中;

      ② 多个 Filter 共同执行的时候,它们都是使用同一个 Request 对象;

  执行流程图:

  

七、Filter 的拦截路径(目标资源)

  目标资源指的是需要调用 Filter 来进行过滤处理的资源。主要有以下几种配置方式:

  1、精确匹配

    通过 <filter-mapping> 下的 url-pattern 来配置

    格式

<url-pattern>/target.jsp</url-pattern>

           以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

    精确匹配只要在请求地址完全一样时才会调用 Filter

  2、目录匹配

    路径匹配只要是所请求的资源在设置的路径下就会调用 Filter

    格式:

<url-pattern>/admin/*</url-pattern>

     以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

  3、后缀名匹配

    后缀匹配只要访问的资源路径是以指定后缀结尾就会调用 Filter

      格式:

<url-pattern>*.html</url-pattern>
以上配置的路径, 表示请求地址必须以.html 结尾才会拦截到
<url-pattern>*.do</url-pattern>
以上配置的路径, 表示请求地址必须以.do 结尾才会拦截到
<url-pattern>*.action</url-pattern>
以上配置的路径, 表示请求地址必须以.action 结尾才会拦截到

  

    注意:Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!

  4、使用 servlet-name 配置

    通过 filter-mapping 中的 servlet-name 来指定过滤的 Servlet

    在 Filter 的 filter-mapping 中增加了一个 servlet-name 标签,这个标签的值是其中某一个 servlet 的名字,在访问 Servlet 时就会调用该过滤器请求。

    如图:

    

八、过滤器细节

  2、过滤器的执行流程?

    (1)执行过滤器

    (2)执行要放行的资源

    (3)回来执行过滤器放行代码下面的代码

  3、过滤器的生命周期方法?

    (1)init 方法:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次,一般用于加载资源。

    (2)doFilter 方法:每一次请求被拦截资源时,会执行。执行多次

    (3)destory 方法:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次,一般用于释放资源。

  4、过滤器配置详解?

    (1)拦截路径配置

       1. 具体资源路径: /index.jsp   只有访问index.jsp资源时,过滤器才会被执行

       2. 拦截目录:        /admin/*     访问/user下的所有资源时,过滤器都会被执行

       3. 后缀名拦截:    *.jsp            访问所有后缀名为jsp资源时,过滤器都会被执行

       4. 拦截所有资源: /*                访问所有资源时,过滤器都会被执行

    (2)拦截方式配置:资源被访问的方式

          在 filter-mapping 还有一个子标签 dispatcher,该标签用来指定需要 Filter 处理的请求类型,该标签可以配置四个值

        配置

          设置 dispatcherTypes 属性

          

属性名 解释
REQUEST 默认值。浏览器直接请求资源
FORWARD 转发访问资源时调用 Filter
INCLUDE 动态包含访问资源时调用Filter
ERROR 错误跳转资源
ASYNC 异步访问资源

       web.xml 配置

           设置 <dispatcher></dispatcher>标签,在里面填入上面的值即可。

        以上四种情况可以设置一个,也可以同时设置多个,如果不设置默认是 Request。

   

JavaWeb 之 Filter:过滤器的更多相关文章

  1. 【JavaWeb】Filter 过滤器

    Filter 过滤器 简介 Filter 过滤器是 JavaWeb 三大组件之一 Filter 过滤器是 JavaEE 的规范,也就是接口 Filter 过滤器的作用是 拦截请求,过滤响应 拦截请求的 ...

  2. javaweb之Filter过滤器详解

    快速入门 1.新建一个类,实现Filter接口 2.实现doFilter()方法,打印一句话,来证明能够进行拦截 3.在web.xml中进行配置(参照Servlet配置) 4.访问一个页面,看看能不能 ...

  3. JavaWeb之Filter过滤器

    原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可以锻炼锻炼.言归正传,过滤器从字面理解她的话有拦网.过滤的功 ...

  4. JavaWeb -- Servlet Filter 过滤器

    1. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技术,开发人员可以实现用户在 ...

  5. javaweb的Filter过滤器设置全站编码

    FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public ...

  6. Introduction of Servlet Filter(介绍javaweb组件之一过滤器filter)

    javaweb的三大组件都需要交给web服务器运行,都需要在web.xml文件中配置. ①Servlet:javax.servlet.Servlet通过http协议接受客户端的请求,并作出响应的Jav ...

  7. Filter过滤器-JavaWeb三大组件之一

    Servlet.Filter.Listener是JavaWeb的三大组件,给Web开发提供了很大的便利. 什么是Filter? Filter,过滤器.类似与生活中的净水器.空气净化器. JavaWeb ...

  8. javaweb学习总结(四十二)——Filter(过滤器)学习

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

  9. javaWeb学习总结(10)- Filter(过滤器)学习

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

随机推荐

  1. Linux的tmpfs和ramfs

    tmpfs tmpfs是一种虚拟内存文件系统, 它的存储空间在VM里面,现在大多数操作系统都采用了虚拟内存管理机制, VM(Virtual Memory) 是由Linux内核里面的VM子系统管理. V ...

  2. Data truncation: Out of range value for column 'quanity' at row 问题解决方案

    由于之前在自己电脑上搭建了mysql 5.6的数据库,但是在服务器上搭建的是mysql 5.7的环境,在运行过程中出现了如下错误: Data truncation: Out of range valu ...

  3. scrapy中的middleware

    反反爬虫相关机制 Some websites implement certain measures to prevent bots from crawling them, with varying d ...

  4. WebGL学习笔记(十一):混合和透明

    到目前为止我们绘制了不少模型,用到了不少颜色,颜色中有四个分量(RGBA),其中的A分量表示透明度,这个分量目前为止我们还没有真正的用到: A分量,表示的是当前的透明度,如果设定为 0.5 就会半透明 ...

  5. 【专】linux nameserver导致的故障

    前言: 大家都知道linux下添加dns服务器,修改/etc/resolv.conf,添加nameserver 119.29.29.29这样一行即可.但是胡乱添加nameserver也会导致故障 ,此 ...

  6. Python 工匠:使用数字与字符串的技巧学习笔记

    #Python 工匠:使用数字与字符串的技巧学习笔记#https://github.com/piglei/one-python-craftsman/blob/master/zh_CN/3-tips-o ...

  7. LeetCode_475. Heaters

    475. Heaters Easy Winter is coming! Your first job during the contest is to design a standard heater ...

  8. phpspreadsheet 中文文档(八)读写文件+读取文件

    2019年10月11日14:09:40 配置设定 将PhpSpreadsheet文件包含在脚本中之后,但是在实例化Spreadsheet对象或加载工作簿文件之前,可以设置许多配置选项,这些配置选项将影 ...

  9. reentrant,thread-safe 和 async-signal-safe

    可重入,线程安全和异步信号安全POSIX定义: Reentrant Function A function whose effect, when called by two or more threa ...

  10. sql简单存储过程分享

    很多程序员朋友都视sql为洪湖水猛兽,其实深入分析一下,多用些时间与耐心,sql还是可以理解的. 本文主要是针对刚刚接触sql的新手朋友,进行一个sql存储过程的简单分享. 小子第一次发布文章,也是借 ...