当前位置: 首页 > news >正文

@WebFilter 注解

@WebFilter 是 Java Servlet 3.0 之后引入的注解(Annotation),用于定义Servlet 过滤器(Filter),避免在 web.xml 里进行繁琐的配置。

1. @WebFilter 的作用

  • 用于标记一个类是Servlet 过滤器

  • 通过 urlPatternsvalue 指定要拦截的请求路径。

  • 过滤器可以在请求到达 Servlet 之前或返回客户端之前进行处理,如权限校验、日志记录、修改请求/响应等。

2. @WebFilter 的基本使用

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

@WebFilter("/*") // 拦截所有请求
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("请求进入过滤器");

        // 继续请求(让请求到下一个过滤器或目标 Servlet)
        chain.doFilter(request, response);

        System.out.println("响应离开过滤器");
    }

    @Override
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}

3. @WebFilter 主要参数

(1)urlPatterns / value

指定要拦截的请求路径。

@WebFilter(urlPatterns = {"/api/*", "/admin/*"})
// 或者
@WebFilter(value = {"/api/*", "/admin/*"})

(2)servletNames

指定拦截特定的 Servlet,而不是路径。

@WebFilter(servletNames = {"MyServlet"})

(3)dispatcherTypes

控制过滤器在请求的哪个阶段执行:

  • REQUEST(默认):普通请求。

  • FORWARDRequestDispatcher.forward() 转发时触发。

  • INCLUDERequestDispatcher.include() 包含时触发。

  • ERROR:错误请求时触发。

  • ASYNC:异步请

    @WebFilter(urlPatterns = "/*", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})
    

    求时触发。

4. 过滤器的执行顺序

  • 多个过滤器按照类名的字母顺序执行,例如:

    • AFilter 先执行,BFilter 后执行。

  • 如果要手动指定顺序,可以使用 @WebFilter 配合 @Order 注解:

@Order(1) // 优先级高,先执行
@WebFilter("/*")
public class FirstFilter implements Filter {}

@Order(2) // 优先级低,后执行
@WebFilter("/*")
public class SecondFilter implements Filter {}

5. @WebFilter vs. web.xml 配置

方式优势劣势
@WebFilter代码简洁,易读不能动态修改,需要重启服务器
web.xml可动态修改,无需改代码代码较冗长,手写 XML

6. 进阶:登录拦截器示例

@WebFilter("/admin/*") // 仅拦截 /admin/ 目录
public class AuthFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        HttpSession session = req.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            res.sendRedirect("/login.jsp"); // 未登录,跳转到登录页面
            return;
        }

        chain.doFilter(request, response); // 继续执行
    }
}

 

总结

  • @WebFilter 用于定义过滤器,拦截特定 URL 或 Servlet 请求。

  • doFilter() 需要调用 chain.doFilter(request, response) 放行请求,否则会中断请求链。

  • 过滤器可以拦截请求、修改响应、实现权限控制、日志记录等功能

  • 可使用 @Order 指定多个过滤器的执行顺序。

相关文章:

  • DeepSeek处理多模态数据的技术要点和实现方式
  • 在CentOS系统上运行Ruby on Rails应用的详细步骤
  • Linux安装JDK
  • JavaScript基础-DOM事件流
  • CSS学习笔记
  • MySQL 入门大全:数据类型
  • 题单:排队接水1
  • ORACLE RAC ASM双存储架构下存储部分LUN异常的处理
  • 基于springboot的电影院管理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • 4-Taurus平台 LCD驱动支持DRM框架移植
  • Spring事务失效场景
  • android音频概念解析
  • mybatisplus雪花算法id重复日记
  • PicFlow:一个图片处理与上传工作流工具(图床上传工具)
  • Debian12生产环境配置笔记
  • systemctl restart 和 systemctl reload 和 systemctl daemon-reload 对比 笔记250322
  • SOFABoot-10-聊一聊 sofatboot 的十个问题
  • QEMU 引导时分离内核和文件系统
  • Collectors.toList / list 转 list
  • Netty——BIO、NIO 与 Netty
  • 加拿大温哥华发生驾车冲撞人群事件,加拿大总理发声
  • 楼下电瓶车起火老夫妻逃生时被烧伤,消防解析躲火避烟注意事项
  • 释新闻|SEVIS是什么?在美留学生遭身份中止意味什么?
  • 2025年上海空间信息大会举行,重大项目集中签约
  • 年客流超2500万,九岁的上海国际旅游度假区有哪些文旅商体实践?
  • 三大猪企去年净利润同比均较大幅度增长,资产负债率齐降