Filter的url-pattern、Filter的生命周期以及FilterConfig和一个拦截访问的小案例

1.url-pattern:Filter的拦截路径,即浏览器在请求什么位置的资源时,过滤器会进行拦截

2.精准匹配/a.jsp对应的请求地址:http://ip[域名]:port/工程路径/a.jsp会拦截

3.目录匹配/manage/*对应的请求地址http://ip[域名]:port/工程路径/manage/xx,即web工程manage目录下所有的资源都会拦截

4.后缀名匹配

5.Filter过滤器只关心请求的地址是否匹配,不关心请求的资源是否存在

Filter的生命周期

图解

Filter的url-pattern、Filter的生命周期以及FilterConfig和一个拦截访问的小案例_第1张图片

 

注意:

1.filter在web项目启动时,由tomcat来创建filter实例,只会创建一个

2.会调用filter的无参构造器,同时会调用init()方法,只会调用一次

3.在创建filter实例时,同时会创建FilterConfig对象,并通过init()方法传入

4.通过FilterConfig对象,可以获取该filter的相关配置信息

5.当一个http请求和该filter的url-patter匹配时,就会调用doFilter方法

6.在调用doFilter方法时,tomcat会同时创建 servletRequest对象 和 servletResponse对象 和 filterChain对象并通过doFilter方法传入

7.如果后面的请求目标资源(jsp/html...)会使用到request和response ,那么会继续传递

FilterConfig

说明:

1.FilterConfig时Filter过滤器的配置类

2.Tomcat每次创建FIlter的时候,也会创建一个FilterConfig对象,这里包含了Filter配置文件的配置信息

3.FilterConfig对象作用是获取filter过滤器的配置内容

FilterConfig的使用
package com.filter;

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

/**
 * 演示FilterConfig的使用
 */
public class FilterConfigTest implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //通过filterConfig 获取相关的参数
        String filterName = filterConfig.getFilterName();
        String ip = filterConfig.getInitParameter("ip");
        ServletContext servletContext = filterConfig.getServletContext();
        //可以获取到该filter所有的配置参数名
        Enumeration initParameterNames = filterConfig.getInitParameterNames();

        //遍历枚举
        while (initParameterNames.hasMoreElements()){
            System.out.println("名字="+initParameterNames.nextElement());
        }

        System.out.println("FilterName=" + filterName);
        System.out.println("ip=" + ip);
        System.out.println("servletContext=" + servletContext);

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

    @Override
    public void destroy() {

    }
}
web.xml文件中配置的相关信息,IP等参数根据需求来写
 
        FilterConfigTest
        com.filter.FilterConfigTest
        
            id
            168.16.15.13
        
        
            port
            8989
        
    
    
        FilterConfigTest
        /abc/*
    
测试:简单的案例
需求:如果访问ip是128.12网段开始的IP地址,就返回登录页面(也就是ip地址由128.12开头,就不允许访问)

注意:web.xml文件中需要写一个IP,然后值为128.12,如下


        FilterConfigTest
        com.filter.FilterConfigTest
        
            id
            128.12
        
    
    
        FilterConfigTest
        /abc/*
    
public class FilterConfigTest implements Filter {
    private String ip;

    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
         ip = filterConfig.getInitParameter("ip");
        }
     @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //通过forbidden ip来进行控制
        //先获取到访问ip
        String remoteAddr = servletRequest.getRemoteAddr();
        if(remoteAddr.contains(ip)){
            System.out.println("封杀该网段");
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
            return;//直接返回
        }
        //继续访问目标资源
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

你可能感兴趣的:(韩顺平学习笔记,java,web,笔记)