Java过滤器的基本概念

概述

Java 过滤器是 Java EE (Jakarta EE) 中的一种组件,用于在请求到达 Servlet 或 JSP 之前对其进行预处理,或者在响应返回客户端之前对其进行后处理。过滤器主要应用于以下场景:

  • 请求参数过滤和转换
  • 字符编码处理
  • 身份验证和授权
  • 日志记录
  • 压缩响应数据
  • 缓存控制

核心接口和方法

  1. init(FilterConfig config) - 初始化过滤器
  2. doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - 执行过滤逻辑
  3. destroy() - 销毁过滤器
java 复制代码
public class CharacterEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

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

    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

配置方式

过滤器可以通过以下方式配置:

1.注解配置(Servlet 3.0+)

使用@WebFilter注解可以直接在过滤器类上配置过滤器,无需在 web.xml 中配置。别忘了在 Spring Boot 应用主类上添加**@ServletComponentScan**注解以启用 Servlet 组件扫描:

java 复制代码
package com.cni23.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * urlPatterns 匹配所有请求,/*拦截所有请求,可以填写具体请求路径
 */
@WebFilter(urlPatterns = "/*",filterName = "CharacterEncodingFilter")
public class CharacterEncodingFilter implements Filter {

    private String encoding;

    /**
     * 初始化过滤器
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String encoding = filterConfig.getInitParameter("encoding");
        if (encoding == null){
            encoding = "UTF-8";
        }
    }

    /**
     * 执行过滤器逻辑
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //获取请求
        HttpServletRequest request =(HttpServletRequest) servletRequest;
        request.setCharacterEncoding(encoding);
        servletResponse.setCharacterEncoding(encoding);
        servletResponse.setContentType("text/html;charset=utf-8");
        //filterChain:链
        //放行,继续执行下一个过滤器,如果没有过滤器,则执行目标资源
        filterChain.doFilter(servletRequest,servletResponse);
    }

    /**
     * 销毁过滤器
     */
    @Override
    public void destroy() {

    }
}

2.web.xml 配置(传统方式)

XML 复制代码
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.cni23.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

3.Java 代码配置(Spring 等框架中常用,)

1)编写过滤规则

java 复制代码
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Enumeration;

public class RequestLoggingFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化逻辑
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        
        // 记录请求信息
        System.out.println("Request URL: " + httpRequest.getRequestURL());
        System.out.println("Method: " + httpRequest.getMethod());
        
        // 记录请求头
        Enumeration<String> headerNames = httpRequest.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            System.out.println(headerName + ": " + httpRequest.getHeader(headerName));
        }
        
        // 继续请求处理链
        chain.doFilter(request, response);
    }
    
    @Override
    public void destroy() {
        // 清理资源
    }
}

2)配置我们的过滤器

java 复制代码
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {
    
    @Bean
    public FilterRegistrationBean<RequestLoggingFilter> loggingFilter() {
        FilterRegistrationBean<RequestLoggingFilter> registrationBean = new FilterRegistrationBean<>();
        
        // 设置过滤器实例
        registrationBean.setFilter(new RequestLoggingFilter());
        
        // 设置过滤器应用的URL模式
        registrationBean.addUrlPatterns("/api/*", "/secure/*");
        
        // 设置过滤器名称
        registrationBean.setName("requestLoggingFilter");
        
        // 设置过滤器执行顺序(值越小,优先级越高)
        registrationBean.setOrder(1);
        
        // 添加初始化参数
        registrationBean.addInitParameter("enabled", "true");
        
        return registrationBean;
    }
}

配置方式对比

  1. 注解配置

    • 优点:简洁、直观,与代码在一起,便于维护
    • 缺点:不够灵活,URL 模式等配置与代码耦合
  2. web.xml 配置

    • 优点:集中管理,配置与代码分离,适合复杂场景
    • 缺点:XML 文件可能变得庞大复杂,难以维护
  3. Java 代码配置

    • 优点:完全的编程控制,可以使用 Spring 的依赖注入
    • 缺点:需要了解 Spring 框架,配置相对复杂

具体使用哪一个可以根据自己的项目来决定。

相关推荐
带刺的坐椅11 分钟前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
四谎真好看2 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
应用市场2 小时前
构建自定义命令行工具 - 打造专属指令体
开发语言·windows·python
桦说编程2 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t2 小时前
ZIP工具类
java·zip
舒一笑2 小时前
大模型时代的程序员成长悖论:如何在AI辅助下不失去竞争力
后端·程序员·掘金技术征文
lang201509282 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
Dfreedom.2 小时前
一文掌握Python四大核心数据结构:变量、结构体、类与枚举
开发语言·数据结构·python·变量·数据类型
一半烟火以谋生2 小时前
Python + Pytest + Allure 自动化测试报告教程
开发语言·python·pytest
虚行2 小时前
C#上位机工程师技能清单文档
开发语言·c#