商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > JavaWeb Servlet中Filter过滤器的详解

JavaWeb Servlet中Filter过滤器的详解

  发布于2026-07-22 阅读(0)

扫一扫,手机访问

Ja vaWeb Servlet中Filter过滤器的详解

在实际的Web开发中,我们常常需要对用户的请求或响应做一些“额外处理”——比如权限校验、敏感词过滤、请求日志记录,甚至是压缩响应信息。这些操作如果分散在每个Servlet里,代码会变得非常冗余且难以维护。这时候,Filter过滤器就派上了用场。

简单来说,Filter就像一个“守门员”,它能够在Servlet被调用之前拦截请求,检查并修改Request对象;也能在Servlet处理完毕之后,对Response对象进行二次加工。最关键的是,Filter本身不能生成请求或响应,它只负责过滤和修改。而且,Filter对象是常驻服务器内存的,不会像Servlet那样每次请求都重新创建实例,所以性能开销很小。

生命周期

Filter的生命周期很清晰,主要分为三个阶段:

(1)服务器启动时,读取web.xml配置文件,加载Filter类并实例化,然后调用init()方法进行初始化。这个阶段只会执行一次。

(2)当用户访问的资源被Filter的url-pattern匹配到时,服务器会调用doFilter()方法。注意,这里需要通过chain.doFilter()将请求交给下一个过滤器或者目标Servlet,否则请求会被拦截住,无法继续往下走。

(3)应用停止或重新装载时,调用destroy()方法释放资源。

Filter过滤链

Ja vaWeb Servlet中Filter过滤器的详解

实际项目中往往不止一个过滤器,比如先做字符编码过滤,再做权限校验。多个过滤器会按照web.xml中定义的先后顺序组装成一条“过滤链”。执行时,每个过滤器依次调用自己的doFilter(),并通过chain.doFilter()把控制权传递下去。这里有一个关键点:任何时候,只要某个过滤器没有执行chain.doFilter(),过滤链就会中断,后面的过滤器和目标Servlet都不会被执行。这种机制让我们可以灵活地实现“提前终止”逻辑,比如用户未登录,直接跳转到登录页面,不再继续处理。

过滤器的配置

要使用Filter,需要做两件事:

第一,写一个类实现ja vax.servlet.Filter接口,并重写doFilter()方法。在doFilter()中,你可以对请求和响应进行预处理和后处理。比如下面的示例代码,检查用户是否登录,如果未登录且访问的是“Buy”或“collect”相关路径,就直接转发到登录页面,不再继续执行后续逻辑。

/* * MyFilter.ja va * 过滤器 */package com.baidu.web;

import ja va.io.IOException;
import ja vax.servlet.Filter;
import ja vax.servlet.FilterChain;
import ja vax.servlet.FilterConfig;
import ja vax.servlet.ServletException;
import ja vax.servlet.ServletRequest;
import ja vax.servlet.ServletResponse;
import ja vax.servlet.http.HttpServletRequest;
import ja vax.servlet.http.HttpServletResponse;

public class MyFilter implements Filter{
    @Override
    public void destroy() { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        //对请求request进行处理
        HttpServletResponse resp = (HttpServletResponse)response;
        HttpServletRequest req = (HttpServletRequest) request;
        String username = (String) req.getSession().getAttribute("username");
        if(req.getRequestURI().contains("Buy") || req.getRequestURI().contains("collect")){
            if(username==null || username.equals("")){
                //满足过滤要求,进行处理
                req.getRequestDispatcher("/login.jsp").forward(req, resp);
                return;
            }
        }
        chain.doFilter(req, resp);
        //对相应response进行处理
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //filterConfig,通过filterConfig的getServletContext() 方法可以获得 ServletContext
    }
}

第二,在web.xml中配置Filter的映射,指定过滤器名称、实现类以及需要拦截的URL模式。比如下面的配置,拦截所有请求(/*):


    filter
    com.baidu.web.MyFilter


    filter
    /*

关于url-pattern的配置,其实有多种写法,比如精确匹配、后缀匹配、通配符等,可以根据实际需求灵活选择。掌握了Filter的基本用法,就能在项目中轻松实现权限控制、日志记录、字符编码统一等通用功能,让代码更加整洁、复用性更强。

本文转载于:https://www.jb51.net/article/125430.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注