第18周 3-过滤器

过滤器(Filter)概念总结

什么是过滤器

过滤器(Filter)是Java Web应用中用于统一拦截和处理请求的组件,类似于现实生活中的空气净化器或安检。它通过对请求进行前置处理,确保请求符合特定要求。

过滤器的执行机制

  1. 当请求从浏览器发送到Tomcat时,首先会经过过滤器,而不是直接到达Servlet。
  2. 请求会依次经过各个过滤器进行处理。每个过滤器可以对请求进行检查、修改等操作。
  3. 处理完请求后,最终请求会到达Servlet进行业务逻辑处理。
  4. 响应则会按照原始路径逆向通过过滤器返回给浏览器。

过滤链

过滤器处理请求的过程称为过滤链。请求在过滤链中依次被处理,确保只有符合要求的请求才能到达Servlet。

过滤器的基本概念

  • 过滤器是用来对请求和响应进行处理的组件,可以在请求到达Servlet之前或响应返回给客户端之前进行拦截。

开发步骤

  1. 实现Filter接口

    • 任何过滤器都需要实现javax.servlet.Filter接口。
  2. 实现doFilter方法

    • doFilter方法是过滤器的核心,定义了过滤器的具体功能。
    • 方法参数包括:
      • ServletRequest request:请求对象
      • ServletResponse response:响应对象
      • FilterChain chain:过滤链,用于将请求和响应传递给下一个过滤器或目标Servlet。
  3. 配置过滤器

    • web.xml文件中进行配置,定义过滤器及其作用的URI。
    • 使用<filter>标签定义过滤器,使用<filter-mapping>标签指定过滤器拦截的请求URI。

示例代码

  • 创建项目和包结构
  • 实现过滤器FirstFilter
package com.imooc.filter;

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

public class FirstFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.printf("过滤器已生效");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

package com.imooc.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("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("<h1>hello servlet</h1>");
    }
}

过滤器的特性

  • 过滤器对象在Web应用启动时被创建且全局唯一。
  • 唯一的过滤器对象在并发环境中采用“多线程”提供服务。

过滤器的配置形式

web.xml中配置过滤器的基本形式如下:

<filter>
    <filter-name>firstFilter</filter-name>
    <filter-class>com.imooc.filter.FirstFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>firstFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

配置与注解的选择总结

本节课探讨了过滤器的配置形式与注解形式各自的优劣,并提供了一些使用建议。

注解形式的优势

  • 注解形式的开发体验更好,配置和源代码放在一起,减少在源代码和配置文件之间来回切换的麻烦。
  • 更适合小型敏捷项目,可以快速开发和迭代。
  • 更适合局部功能的设置,如特定的Servlet,因为Servlet的映射地址通常较为稳定,职责单一,注解可以让开发更灵活。

配置形式的优势

  • 配置形式更适合大型系统,尤其是需要全局过滤的场景,如全局的字符集过滤器等。
  • 维护性更强,配置在web.xml中可以灵活修改,无需重新编译代码。
  • 更适合全局应用过滤,在真实项目中,过滤器常用于全局性的请求处理。

使用建议

  1. 全局过滤器(如字符集过滤器):推荐使用配置形式,放在web.xml中。
  2. 局部功能或小范围设置(如Servlet):推荐使用注解形式,让开发更灵活,增强开发体验。

注解形式虽然开发体验好,但在全局性应用场景下,配置文件形式更具优势。而在局部、单一职责的场景下,注解则显得更加适合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值