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

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

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

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

4.后缀名匹配

XML 复制代码
<!--
<url-pattern>*.jsp</url-pattern>后缀可改变,比如:*.action *.do等等对应的请求
-->

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

Filter的生命周期

图解
注意:

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的使用
java 复制代码
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<String> 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等参数根据需求来写
XML 复制代码
 <filter>
        <filter-name>FilterConfigTest</filter-name>
        <filter-class>com.filter.FilterConfigTest</filter-class>
        <init-param>
            <param-name>id</param-name>
            <param-value>168.16.15.13</param-value>
        </init-param>
        <init-param>
            <param-name>port</param-name>
            <param-value>8989</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>FilterConfigTest</filter-name>
        <url-pattern>/abc/*</url-pattern>
    </filter-mapping>
测试:简单的案例
需求:如果访问ip是128.12网段开始的IP地址,就返回登录页面(也就是ip地址由128.12开头,就不允许访问)

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

XML 复制代码
<filter>
        <filter-name>FilterConfigTest</filter-name>
        <filter-class>com.filter.FilterConfigTest</filter-class>
        <init-param>
            <param-name>id</param-name>
            <param-value>128.12</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>FilterConfigTest</filter-name>
        <url-pattern>/abc/*</url-pattern>
    </filter-mapping>
java 复制代码
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() {

    }
}
相关推荐
超级码.里奥.农8 分钟前
零基础 “入坑” Java--- 七、数组(二)
java·开发语言
hqxstudying17 分钟前
Java创建型模式---单例模式
java·数据结构·设计模式·代码规范
挺菜的26 分钟前
【算法刷题记录(简单题)002】字符串字符匹配(java代码实现)
java·开发语言·算法
A__tao26 分钟前
一键将 SQL 转为 Java 实体类,全面支持 MySQL / PostgreSQL / Oracle!
java·sql·mysql
一只叫煤球的猫37 分钟前
真实事故复盘:Redis分布式锁居然失效了?公司十年老程序员踩的坑
java·redis·后端
猴哥源码40 分钟前
基于Java+SpringBoot的农事管理系统
java·spring boot
面朝大海,春不暖,花不开1 小时前
Java网络编程:TCP/UDP套接字通信详解
java·网络·tcp/ip
慕y2741 小时前
Java学习第十五部分——MyBatis
java·学习·mybatis
A__tao1 小时前
SQL 转 Java 实体类工具
java·数据库·sql
喝可乐的布偶猫2 小时前
Java类变量(静态变量)
java·开发语言·jvm