filter(过滤器)的简单介绍

过滤器filter的简介

 filter 是对客户端访问资源的请求的过滤,当符合条件的时候放行,不符合条件的不放行,并且可以对目标资源访问前后进行逻辑处理。

filter的工作流程大致如下所示:

如何编写一个过滤器?

1.编写一个过滤器的类实现 filter 接口。

2.实现接口中尚未实现的方法(着重实现 doFilter() 方法)

3.web.xml中进行配置(主要是配置要对哪些资源进行过滤)

filter的api详解

filter生命周期的相关方法

Filter接口有三个方法,并且这个三个都是与Filter的生命相关的方法

 init(Filterconfig) 代表filter对象初始化方法 filter对象创建时执行

 doFilter(ServletRequest,ServletResponse,FilterCha) 代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法

 destory() 代表是filter销毁方法 当filter对象销毁时执行该方法

扫描二维码关注公众号,回复: 4480127 查看本文章

filter对象的生命周期

filter何时创建:服务器启动时就创建该filter对象

filter何时销毁:服务器关闭时filter销毁

filter的api详解

init(FilterConfig filterConfig)

其中参数 FilterConfig 代表该filter对象的配置信息的对象,内部封装是该filter的配置信息。

destory()

filter对象销毁时执行

doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)

其中的参数:

ServletRequest/ServletResponse:每次在执行doFilter方法时,web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。该request和该response就是在访问目标资源的service方法时的request和response。

FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求。

下面是filter的工作流程:

案例介绍

/**
 * Copyright (C), 2018, hzhiping
 * Title:FilterDemo01
 * Author:hzhiping
 * Date:2018/12/12 20:09
 * Description: filter的api方法和过滤的相关api方法介绍
 */
package com.hzhiping.filter;

import javax.servlet.*;
import java.io.IOException;

public class FilterDemo01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化--------");
        // filter创建的时候执行这个方法
        // 获取web.xml中filter的名称
        System.out.println(filterConfig.getFilterName());
        // 获取当前filter的初始化参数
        System.out.println(filterConfig.getInitParameter("hzhiping"));
        // 获取ServletContext
        filterConfig.getServletContext();
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("FilterDemo01执行之前-----");
        // 让目标资源放行
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("FilterDemo01执行之后-----");
    }

    @Override
    public void destroy() {
        System.out.println("FilterDemo01销毁------");
    }
}

写完filter之后,编写配置文件 web.xml :

运行该案例:

filter的配置介绍

此处我们以一个完整的web.xml进行介绍filter的相关配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <display-name>Archetype Created Web Application</display-name>
    <filter>
        <filter-name>filterDemo01</filter-name>
        <filter-class>com.hzhiping.filter.FilterDemo01</filter-class>
        <init-param>
            <param-name>hzhiping</param-name>
            <param-value>coder</param-value>
        </init-param>
        <init-param>
            <param-name>hzhihui</param-name>
            <param-value>student</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo01</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>ERROR</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ASYNC</dispatcher>
    </filter-mapping>
</web-app>

filter:注册一个过滤器

  filter-name:过滤器的名称

  filter-class:过滤器所在的类的全路径

  init-param:初始化参数

    param-name:参数名称

    param-value:参数值

filter-mapping:过滤器的映射

  filter-name:过滤器名称,通过这个来映射到注册的过滤器,然后找到注册的过滤器的所在的类

  url-pattern:设置filter所拦截的请求路径

    1.完全匹配:/servlet01

    2.目录匹配:/aaa/bbb/*

            /user/*:访问前台的资源进入此过滤器

               /admin/*:访问后台的资源的时候执行此过滤器

    3.扩展名匹配:*.html,*.jsp

  dispatcher:访问的方式(了解)

    REQUEST:默认值,代表直接访问某个资源时执行filter

    FORWARD:转发时才执行filter

    INCLUDE: 包含资源时执行filter

    ERROR:发生错误时 进行跳转是执行filter

坚壁清野

猜你喜欢

转载自www.cnblogs.com/hzhiping/p/10110977.html