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、说明

  1. 首先创建一个类,实现 javax.servlet.Filter 接口。
  2. WebFilter("/*")表示对所有请求进行过滤,
  3. 实现 接口中的doFilter 方法,这是过滤器的主要方法,用于处理请求和响应。
  4. 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 } 

五、总结

本文章属于学习过程中的个人总结,欢迎大家批评指正。

 

 

 

 

 

 

 

 

posted @ 2023-08-10 20:17  qi_8080  阅读(1428)  评论(0)    收藏  举报