Filter过滤器

  • 过滤器(Filter)也称拦截器,是Servlet2.3规范新增的功能,在Servlet2.4规范中得到增强。
  • Filter是Servlet技术中非常实用的技术,Web开发人员通过Filter技术,可以在用户访问某个web资源之前,对访问的请求和响应进行拦截,从而实现一些特殊功能。(例如,验证用户访问权限,记录用户操作、对请求重新编码、压缩响应信息等)

过滤器所处的位置


 

过滤器运行原理


  • 当用户的请求到达指定的网页之前,可以借助过滤器来改变这些请求的内容,此过程称为“预处理”;
  • 当执行结果要响应到用户之前,可经过过滤器修改响应输出内容,此过程称为“后处理”。

过滤器的运行过程


  1. web容器判断接收的请求资源是否有与之匹配的过滤器,如果有,容器将请求交给相应过滤器进行处理
  2. 在过滤器预处理过程中,可以改变请求的内容,或者重新设置请求的报头信息,然后将请求发给目标资源
  3. 目标资源对请求进行处理后做出响应
  4. 容器将响应转发回过滤器
  5. 在过滤器后处理过程中,可以根据需求对响应的内容进行修改
  6. web容器将响应发送回客户端

过滤器链


  • 在一个web应用中也可以部署多个过滤器,这些过滤器组成了一个过滤器链。
  • 过滤器链中每个过滤器负责特定的操作和任务,客户端请求可以在这些过滤器之间传递,直到达到目标资源。
  • 例如,一个由两个filter组成的过滤器链的过滤过程

 过滤器核心接口


javax.servlet.Filter接口

javax.servlet.FilterConfig接口

javax.servlet.FilterChain接口

Filter接口的方法及说明


  • 与开发Servlet需要实现Servlet接口类似,开发Filter要实现javax.servlet.Filter接口,并提供一个公共的不带参数的构造方法。
  • Filter接口的方法及说明

 过滤器的生命周期


加载和实例化

  •  web容器启动时,会根据@WebFilter属性filterName所定义类名的大小写拼写顺序,或者web.xml中声明的Filter顺序依次实例化Filter;

初始化

  • web容器调用init(FilterConfig config)方法来初始化过滤器。容器在调用该方法时,向过滤器传递FilterConfig对象。实例化和初始化的操作只会在容器启动时执行,并且只会执行一次。

doFilter()方法的执行

  • 当客户请求目标资源的时候,容器会筛选出符合过滤器映射条件的Filter,并按照@WebFilter属性firstNamee所定义类名的大小写拼写顺序,或者web.xml中声明的filter-mapping的顺序依次调用这些过滤器的doFilter()方法
  • 在这个链式调用过程中,可以调用FilterChain对象的doFilter方法将请求传给下一个过滤器(或目标资源),也可以直接向客户端返回响应信息,或者利用请求转发或重定向请求转向其他资源。需要注意的是这个方法的请求响应参数的类型是ServletRequest和ServletResponse,过滤器的使用并不依赖于具体的协议。

销毁

  • web容器调用destory()方法指示过滤器生命周期结束。在这个方法中,可以释放过滤器使用的资源。

FilterConfig接口


  • javax.servlet.FilterConfig接口由容器实现,容器将其实例作为参数传入过滤器对象的初始化方法中init(),来获取过滤器的初始化参数和servlet的相关信息。
  • FilterConfig接口主要方法及作用

 

FilterChain接口


javax.servlet.FilterChain接口由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器使用filterChain对象调用过滤器中的下一个过滤器,那么将调用目标资源

FilterChain接口主要方法及作用:

 过滤器开发


  • 基于过滤器的核心接口,一个过滤器的开发可以经过三个步骤:
  1. 创建Filter接口实现类
  2. 编写过滤器的功能代码
  3. 对过滤器进行声明配置

过滤器声明配置


在servlet3.0以上版本,既可以用@WebFilter形式的Annotation对Filter进行声明配置,也可以在web.xml文件中进行配置。

@WebFilter所支持的常用属性

 

 

 

 

【示例】使用@WebFilter配置Filter

 

 ExampleFilter

package com.qst.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;

@WebFilter(
        urlPatterns = {"/index.jsp"},
        initParams = {
                @WebInitParam(name = "param",value = "实训")
        }
)
public class ExampleFilter implements Filter {
    private FilterConfig  filterConfig;

    public void destroy() {
        this.filterConfig.getServletContext().log("销毁方法destory()执行!");
        System.out.println("销毁方法destory()执行!");
        this.filterConfig = null;
        /*销毁时调用*/
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        /*过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理*/
        Long startTime = System.currentTimeMillis();
        this.filterConfig.getServletContext().log(startTime+"请求经过过滤器"+this.getClass().getName());
        System.out.println(startTime+"请求经过过滤器"+this.getClass().getName());

        chain.doFilter(req, resp);//交给下一个过滤器或servlet处理
        Long stopTime = System.currentTimeMillis();
        this.filterConfig.getServletContext().log(stopTime+"响应经过过滤器"+this.getClass().getName());
        System.out.println(stopTime+"响应经过过滤器"+this.getClass().getName());
    }

    public void init(FilterConfig config) throws ServletException {
        this.filterConfig = config;
        config.getServletContext().log("初始化init方法执行 获取初始化参数:"+config.getInitParameter("param"));
        System.out.println("初始化init方法执行 获取初始化参数:"+config.getInitParameter("param"));
    }

}

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>首页</title>
</head>
<body>
    <p>过滤器开发应用</p>
</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值