一、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. 原创:【ajax | axios跨域简单请求+复杂请求】自定义header头Token请求Laravel5后台【亲测可用】

    如标题:我想在ajax的header头增加自定义Token进行跨域api认证并调用,api使用laravel5编写,如何实现? 首先,了解下CORS简单请求和复杂请求.  -- CORS简单请求 -- ...

  2. 时间管理GTD

    时间管理—重要紧急四象限法则https://www.jianshu.com/p/30b2ab0dc20e<番茄工作法图解>—— 让你的工作高效起来https://www.jianshu.c ...

  3. 在easyui-tabs中的href或 content的多种条件下的不同页面内容和页面地址的赋值?

    $('#tt').tabs('add', {.....});中 的 加载内容, 可以用content, 或用 href都是可以的. 虽然它们加载 的方式不一样, 但是 只要是加载进去后, 加载成功后, ...

  4. odoo开发笔记 -- 还原数据库后,异常:ir_attachment: IOError: [Errno 2] No such file or directory: u'/var/...'

    场景描述: 恢复Odoo数据后,抛出错误导致无法进入页面 -- ::, INFO aeo odoo.addons.base.ir.ir_attachment: _read_file reading / ...

  5. k8s记录-k8s基本概念和术语

    每次个节点上当然都要运行Docker.Docker来负责所有具体的映像下载和容器运行. Kubernetes主要由以下几个核心组件组成: etcd保存了整个集群的状态: apiserver提供了资源操 ...

  6. Postgresql单表【插入】/【更新】百万数据

    一.插入数据 说到插入数据,一开始就想到: insert int A values(*******************) 插入多条数据,最多想到:写成这样: insert into A value ...

  7. LeetCode_475. Heaters

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

  8. jQuery prop方法替代attr方法

    jquery attr()方法获取标签的 checked 会有问题,所以用了 prop() 方法.

  9. Linux——xargs命令学习

    有时候我们会遇到需要将指定命令返回结果进行处理的情况 这种情况下,可能就需要写for循环之类的脚本进行处理了(目前我只能想到这种方法) 但是想起来还有一个xargs命令,组合这个命令就比较省事了. 场 ...

  10. Entity Framework Core for Console

    包 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCor ...