Java web过滤器(Filter)
一、什么是过滤器?
过滤器(Filter):在 JavaEE 中,过滤器通常称为 "Filter"。过滤器是一种可以拦截 HTTP 请求和响应的组件,用于在 Servlet 执行前后执行某些操作。它们用于对请求和响应进行修改、转换或者预处理,比如字符编码转换、权限验证等。“过滤器”适用于 Servlet 技术栈。
二、简单使用使用
1、 先放代码
1 import javax.servlet.*; 2 import java.io.IOException; 3 @WebFilter("/*") 4 public class MyFilter implements Filter { 5 @Override 6 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 7 throws IOException, ServletException { 8 9 // 放行前的代码逻辑 10 11 // 放行的代码 12 chain.doFilter(request, response); 13 14 // 放行后的代码逻辑 15 16 } 17 18 // 实现 init() 和 destroy() 方法,可以进行初始化和资源释放操作 19 }
2、说明
- 首先创建一个类,实现
javax.servlet.Filter接口。 - WebFilter("/*")表示对所有请求进行过滤,
- 实现 接口中的
doFilter方法,这是过滤器的主要方法,用于处理请求和响应。 doFilter方法有三个参数,分别是ServletRequest、ServletResponse、以及FilterChain。前两个在这里不做详细介绍。这里我们主要看第三个参数类型FitterChain
(1)我们先来看一下FillerChain中的内容![]()
根据FillerChain中的内容我们可以看出它只有一个方法,也就是FilterChain()方法。此方法其实就是对拦截进行放行的。而放行前、放行、以及放行后也就是根据此方法进行区分的。在此方法之前我们处理放行前的业务逻辑,也是处理请求。而在此方法之后我们便是处理放行后的逻辑,也是处理响应。
三、配置过滤器(Filter)拦截路径
在 Java Web 应用中,你可以使用两种不同的方式来配置 `Filter` 的拦截路径,即通过 `web.xml` 文件或者使用 Servlet 4.0+ 的注解方式。下面我将为你详细介绍这两种方法:
1. 在 web.xml 文件中配置拦截路径:
这是一种传统的配置方式,适用于 Servlet 2.5+ 版本的 Java Web 应用。在 `web.xml` 文件中配置 `Filter` 的拦截路径步骤如下:
1. 打开 `web.xml` 文件,该文件通常位于 `WEB-INF` 目录下。
2. 在 `<web-app>` 标签内部,配置 `<filter>` 和 `<filter-mapping>` 元素。
1 <web-app> 2 <!-- 配置 Filter --> 3 <filter> 4 <filter-name>MyFilter</filter-name> 5 <filter-class>com.example.MyFilter</filter-class> 6 </filter> 7 8 <!-- 配置 Filter 的拦截路径 --> 9 <filter-mapping> 10 <filter-name>MyFilter</filter-name> 11 <url-pattern>/path/*</url-pattern> 12 </filter-mapping> 13 </web-app>
在上面的示例中,`<filter-name>` 标签中的名称应与 `<filter-name>` 和 `<filter-class>` 中配置的名称一致,这样可以将 `Filter` 与其拦截路径关联起来。`<url-pattern>` 标签中的路径模式指定了要拦截的 URL 路径。
2. 使用注解配置拦截路径:
从 Servlet 3.0 开始,Java Web 应用引入了基于注解的配置方式,使配置更加简洁和可读性更高。使用注解配置 `Filter` 的拦截路径的步骤如下:
1. 在你的 `Filter` 类上使用 `@WebFilter` 注解,并在该注解的 `urlPatterns` 属性中指定拦截的路径模式。
1 import javax.servlet.annotation.WebFilter; 2 import javax.servlet.Filter; 3 import javax.servlet.FilterChain; 4 import javax.servlet.FilterConfig; 5 import javax.servlet.ServletException; 6 import javax.servlet.ServletRequest; 7 import javax.servlet.ServletResponse; 8 import java.io.IOException; 9 10 @WebFilter(urlPatterns = "/path/*") 11 public class MyFilter implements Filter { 12 // Filter 的逻辑代码 13 }
在上面的示例中,`@WebFilter` 注解用于将 `MyFilter` 类与指定的拦截路径关联起来。`urlPatterns` 属性中指定了拦截的 URL 路径模式。
无论你选择哪种方式,都可以根据自己的需求来配置 `Filter` 的拦截路径,以达到正确拦截和处理特定请求的目的。
四、过滤器(Filter)的生命周期
1、初始化(Initialization): 在过滤器实例化后,容器会调用过滤器的 init 方法,用于初始化过滤器的资源和配置。这个方法在过滤器的生命周期中只会被调用一次。在 init 方法中,你可以进行一些初始化工作,如读取配置文件等。
1 public void init(FilterConfig filterConfig) throws ServletException { 2 // 初始化操作,读取配置等 3 }
2、运行中(Request Processing): 一旦过滤器初始化完成,它会开始拦截请求。当请求匹配过滤器所配置的拦截路径时,容器会调用过滤器的 doFilter 方法来处理请求。在这个阶段,你可以对请求进行修改、记录日志、验证身份等操作。
1 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 2 throws IOException, ServletException { 3 // 请求处理前的操作 4 chain.doFilter(request, response); // 继续请求处理 5 // 请求处理后的操作 6 }
3、销毁(Destruction): 当 Web 应用关闭或过滤器被从应用中移除时,容器会调用过滤器的 destroy 方法,用于释放资源、关闭连接等清理工作。和 init 方法一样,destroy 方法也只会被调用一次。
1 public void destroy() { 2 // 清理资源,关闭连接等 3 }
五、总结
本文章属于学习过程中的个人总结,欢迎大家批评指正。


浙公网安备 33010602011771号