第18周 3-过滤器
过滤器(Filter)概念总结
什么是过滤器
过滤器(Filter)是Java Web应用中用于统一拦截和处理请求的组件,类似于现实生活中的空气净化器或安检。它通过对请求进行前置处理,确保请求符合特定要求。
过滤器的执行机制
- 当请求从浏览器发送到Tomcat时,首先会经过过滤器,而不是直接到达Servlet。
- 请求会依次经过各个过滤器进行处理。每个过滤器可以对请求进行检查、修改等操作。
- 处理完请求后,最终请求会到达Servlet进行业务逻辑处理。
- 响应则会按照原始路径逆向通过过滤器返回给浏览器。
过滤链
过滤器处理请求的过程称为过滤链。请求在过滤链中依次被处理,确保只有符合要求的请求才能到达Servlet。
过滤器的基本概念
- 过滤器是用来对请求和响应进行处理的组件,可以在请求到达Servlet之前或响应返回给客户端之前进行拦截。
开发步骤
-
实现Filter接口
- 任何过滤器都需要实现
javax.servlet.Filter
接口。
- 任何过滤器都需要实现
-
实现doFilter方法
doFilter
方法是过滤器的核心,定义了过滤器的具体功能。- 方法参数包括:
ServletRequest request
:请求对象ServletResponse response
:响应对象FilterChain chain
:过滤链,用于将请求和响应传递给下一个过滤器或目标Servlet。
-
配置过滤器
- 在
web.xml
文件中进行配置,定义过滤器及其作用的URI。 - 使用
<filter>
标签定义过滤器,使用<filter-mapping>
标签指定过滤器拦截的请求URI。
- 在
示例代码
- 创建项目和包结构
- 实现过滤器
FirstFilter
package com.imooc.filter;import javax.servlet.*;
import java.io.IOException;public class FirstFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.printf("过滤器已生效");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic 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 {@Overrideprotected 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
中可以灵活修改,无需重新编译代码。 - 更适合全局应用过滤,在真实项目中,过滤器常用于全局性的请求处理。
使用建议
- 全局过滤器(如字符集过滤器):推荐使用配置形式,放在
web.xml
中。 - 局部功能或小范围设置(如Servlet):推荐使用注解形式,让开发更灵活,增强开发体验。
注解形式虽然开发体验好,但在全局性应用场景下,配置文件形式更具优势。而在局部、单一职责的场景下,注解则显得更加适合。