浅析Servlet过滤器

服务器
Servlet过滤器和 Servlet 很类似,注意的是它有拦截客户端请求的用法,Servlet过滤器可以改变请求中的内容,满足实际开发的需要。

[[409335]]

本文转载自微信公众号「码工是小希」,作者码工是小希。转载本文请联系码工是小希公众号。

1 定义

Servlet过滤器和 Servlet 很类似,注意的是它有拦截客户端请求的用法,Servlet过滤器可以改变请求中的内容,满足实际开发的需要。

开发来讲,过滤器实质上是在Web应用服务器里面的一个Web组件,目的用在拦截客户端(浏览器)与目标资源的请求,并把这些请求进行一定过滤处理发给目标资源:

从图看出,Web容器部署过滤器后,不仅客户端发送的请求会经过过滤器的处理,要不要返回呢?是的,请求的回应信息也同样要经过过滤器。

如果一个Web应用中使用一个过滤器不能解决实际的业务需求,那可以部署多个过滤器对业务请求多次处理,这样做就组成一个过滤器链,Web容器在处理过滤器时,将被过滤器的先后顺序对请求进行处理:

Web服务器中部署过滤器链,那请求会一次按照过滤器顺序进行处理,在第一个过滤器处理一请求后,会传递给第二个过滤器进行处理,依次类推,传递到最后一个过滤器为止,再将请求交给目标资源进行处理,目标资源在处理经过过滤的请求后,其回应信息再从最后一个过滤器依次传递到第一个过滤器,最后传送到客户端;

2 过滤器核心对象

过滤器对象放在 javax.servlet 包中,叫做 Filter, 是个接口,与过滤器相关的对象还有 FilterConfig对象 与 FilterChain对象,这两个也同样是接口对象,位于 javax.servlet 包中,分别作为过滤器的配置对象与过滤器的传递工具。在实际开发,定义过滤器对象只需要直接或间接地实现 Filter接口即可。下图的MyFilter1过滤器与MyFilter2过滤器,而 FilterConfig对象 与 FilterChain对象 用在过滤器的相关操作:

Filter接口

每个过滤器对象只直接或间接地实现 Filter接口,在Filter接口中定义了3个方法,分别是 init(),doFilter()和destroy(),说明如表:

方法 声明
public void init(FilterConfig filterConfig) throws ServletException 过滤器初始化方法,该方法在过滤器初始化时调用
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 对请求进行过滤处理
public void destroy() 销毁方法,以便释放资源

FilterConfig接口

它是Servlet容器进行实现,主要是获取过滤器中的配置信息,其方明及说明如表:

方法 说明
public String getFilterName() 用于获取过滤器的名字
public ServletContext getServletContext() 获取Servlet上下文
public String getInitParameter(String name) 获取过滤器的初始化参数值
public Enumeration getInitParameterNames() 获取过滤器的所有初始化参数

FilterChain接口

它由Servlet容器进行实现,在这个接口中一个方法,其方法声明:public void doFilter(ServletRequest request, ServletResponse response)throws IOException,ServletException 该方法将过滤的请求传给下一个过滤器,如果此过滤器已经是过滤器链中的最后一个过滤器,那么,请求传给目标资源。

过滤器创建于配置

创建一个过滤器对象需要实现 javax.serjavax.servlet.Filter接口,下面演示过滤器的创建:

创建名称为 MyFilter的过滤器对象:

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servletFilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
 
/** 
* 过滤器 
*/ 
public class MyFilter implements Filter{ 
       //初始化方法 
       public void init(FilterConfig fConfig) throws ServletException{ 
       //初始化处理 
       } 
       //过滤处理方法 
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletEXception { 
       //过滤处理 
       chain.doFilter(request, response); 
       } 
       //销毁方法 
       public void destroy(){ 
       //释放资源 
       }      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

过滤器的init()对过滤器的初始化进行处理,destroy()是过滤器的销毁方法,主要是释放资源,对于过滤器处理的业务需要编写到doFilter()里面,在请求过滤要调用chain参数的doFilter()把请求向下传给下一过滤器或目标资源:

使用过滤器并不一定要将请求向下传递到下一过滤器或目标资源,如果业务逻辑需要,也可以在过滤处理后,直接回应客户端;

过滤器与Servlet也十分相似,在创建后同样对其配置,过滤器的配置主要分为两个步骤,分别是声明过滤器对象和创建过滤器映射,创建叫MyFilter的过滤器对象:

<!- 过滤器声明 -> 
<filter> 
      <!- 过滤器的名称 -> 
      <filter-name>MyFilter</filter-name
      <!- 过滤器的完整类名 -> 
      <filter-class>com.lyq.Myilter</filter-class> 
</filter> 
<!- 过滤器映射 -> 
<filter-mapping> 
    <!- 过滤器名称 -> 
    <filter-name>MyFilter</filter-name
    <!-- 过滤器 URL映射 -> 
    <url-pattern>/MyFilter</filter-name
    <!- 过滤器URL映射 -> 
    <url-pattern>/MyFilter</url-pattern> 
</filter-mapping>     
       
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

 

 

责任编辑:武晓燕 来源: 码工是小希
相关推荐

2009-07-03 18:26:11

Servlet过滤器

2009-07-08 15:30:56

Servlet过滤器

2009-07-08 16:07:04

Servlet过滤器配

2009-07-08 17:33:37

Servlet过滤器

2009-07-06 13:02:49

Servlet过滤器

2011-07-14 13:20:49

Servlet过滤器

2009-07-08 16:10:36

Servlet和JSPJSP页面

2024-01-05 09:04:35

隆过滤器数据结构哈希函数

2024-11-04 08:45:48

布隆过滤器元数据指纹值

2011-06-29 16:14:59

Qt 事件 过滤器

2009-09-29 13:55:23

Hibernate设置

2009-07-14 09:09:08

Swing模型过滤器

2009-06-18 10:13:00

Hibernate过滤

2009-09-25 15:19:44

Hibernate过滤

2017-07-18 14:10:31

大数据Apache Flum过滤器

2024-03-15 11:21:22

布隆过滤器数据库数据

2016-12-07 09:56:13

JavaFilter过滤器

2023-01-26 01:41:27

核心全局过滤器

2017-04-12 14:43:01

Spring ClouZuul过滤器

2010-03-01 14:45:07

Linux文件重定向
点赞
收藏

51CTO技术栈公众号