Filter

简介

filter也称之为过滤器,它是javaWeb三大组件之一(Servlet程序、Listener监听器、Filter过滤器)

作用:既可以对请求进行拦截,也可以对响应进行处理。

Filter详细介绍

    /**
     * web应用启动时,web服务器将创建Filter的实例对象,并调用init方法,读取web.xml的配置,完成对象的初始化功能,
     * 从而为后续的用户请求做好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次,开发人员通过init的参数,
     * 可或得代表当前filter配置信息的FilterConfig对象)
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
 
    }
 
    /**
     * 这个方法完成实际的过滤操作,当客户请求访问与过滤器相关联的URL的时候,Servlet过滤器将先执行doFilter方法,FilterChain参数用于访问后续过滤器
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
 
    }
 
    /**
     * filter创建后会保存在内存中,当web应用移除或者服务器停止时才销毁,该方法在Filter的生命周期中仅执行一次,在这个方法中,可以释放过滤器使用的资源
     */
    @Override
    public void destroy() {
 
    }

生命周期

(1)init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
(2)doFilter:每一次请求被拦截资源时,会执行。执行多次
(3)destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

过滤器链

执行顺序:如果有两个过滤器:过滤器1和过滤器2
(1)过滤器1
(2)过滤器2
(3) 资源执行
(4) 过滤器2
(5)过滤器1

过滤器先后顺序问题:
 (1)注解配置:按照类名的字符串比较规则比较,值小的先执行
      如: AFilter 和 BFilter,AFilter就先执行了。
 (2)web.xml配置: <filter-mapping>谁定义在上边,谁先执行

如何配置过滤器

要想调用配置一个过滤器:
1)启动类上增加注解@ServletComponentScan
2)新建一个类使其实现Filter接口,并实现里面的三个方法
3)在新建类上加上@WebFilter()注解,配置需要拦截的规则
4)在doFilter方法中控制filterChain.doFilter(servletRequest, servletResponse)调用

案例

package com.filters;

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

/*
1.实现Filter接口
2.重写过滤方法
3.配置过滤器
   web.xml
   注解
 */
public class LoggingFilter implements Filter {

    /*
    过滤请求和响应的方法
        1.请求到达目标资源之前,先经过该方法
        2.该方法有能力控制请求是否继续向前到达目标资源,可以在该方法内直接向客户端做响应处理
        3.请求到达目标资源后,响应之前,还会经过该方法
     */

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        /*
        1.请求达到目标资源之前的功能代码
            判断是否登录
            校验权限是否满足
            ······
         2.放行代码
         3.响应之前 HttpServletResponse 转换为响应报文之前的功能代码
         */
        //请求到达目标资源之前的代码
        System.out.println("LoggingFilter before filterChain");
        //放行
        filterChain.doFilter(servletRequest, servletResponse);
        //响应之前的功能代码
        System.out.println("LoggingFilter after filterChain");
    }
}
package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/servlet1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet1");
        resp.getWriter().println("servlet1");
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置过滤器-->
    <filter>
        <filter-name>loggingFilter</filter-name>
        <filter-class>com.filters.LoggingFilter</filter-class>
    </filter>
    <!--配置过滤器的过滤资源规则 路径 servlet-name-->
    <filter-mapping>
        <filter-name>loggingFilter</filter-name>
        <!--
        url-pattern   根据请求的资源路径 对路径的请求进行过滤
            /*        过滤全部资源
            /a/*      过滤以a开头的资源
            *.html    过滤以html为后缀的资源
            /servlet1 对servlet1进行过滤
         servlet-name   根据请求的servlet的别名,对指定的servlet的资源进行过滤
        -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--context-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </context-param>
    <context-param>
        <param-name>encoding</param-name>
        <param-value>haha</param-value>
    </context-param>
    <servlet>
        <servlet-name>servlet1</servlet-name>
        <servlet-class>com.servlet.Servlet1</servlet-class>
        <init-param>
            <param-name>keya</param-name>
            <param-value>valueA</param-value>
        </init-param>
        <init-param>
            <param-name>keyb</param-name>
            <param-value>valueB</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet1</servlet-name>
        <url-pattern>/servlet1</url-pattern>
    </servlet-mapping>-->
</web-app>
posted @ 2025-03-19 22:24  LuoboWang  阅读(27)  评论(0)    收藏  举报