Filter介绍

本文详细介绍了Filter的概念及作用,包括其在用户请求和响应过程中的预处理和后处理功能,并提供了具体的实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Filter可认为是Servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成响应,这一点与servlet相同,但实际处理中很少会使用Filter向用户请求生成响应。使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

      Filter有如下几个用处:

(1)在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。

(2)根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。

(3)在HttpServletResponse到达客户端之前,拦截HttpServletResponse。

(4)根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

        Filter有如下4个种类:

(1)用户授权的Filter:负责检查用户请求,根据请求过滤用于非法请求。

(2)日志Filter:详细记录某些特殊用户的请求。

(3)负责解码的Filter:包括对非标准的请求解码。

(4)能改变XML内容的XSLT Filter等。

(5)Filter可负责拦截多个请求或响应;一个请求后响应也可被多个Filter拦截。

  


Filter类的创建:

 

复制代码
 1 package com.iot.myjee;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletContext;
 9 import javax.servlet.ServletException;
10 import javax.servlet.ServletRequest;
11 import javax.servlet.ServletResponse;
12 import javax.servlet.annotation.WebFilter;
13 import javax.servlet.http.HttpServletRequest;
14 
15 @WebFilter(filterName="log",urlPatterns={"/*"})       
16 public class LogFilter implements Filter {
17     
18     private FilterConfig config;//用于访问Filter的配置信息
19 
20     @Override
21     public void destroy() {
22         config = null;
23     }
24 
25     @Override
26     public void doFilter(ServletRequest request, ServletResponse response,
27             FilterChain chain) throws IOException, ServletException {
28         //------对用户请求进行预处理
29         ServletContext context = this.config.getServletContext();
30         long before = System.currentTimeMillis();
31         System.out.println("开始过滤...");
32         HttpServletRequest hrequest = (HttpServletRequest)request;
33         System.out.println("Filter已经截获到用户请求的地址:"+hrequest.getServletPath());
34         //Filter只是链式处理,请求依然放行到目的地址
35         chain.doFilter(request, response);
36         //-----后处理部分
37         long after = System.currentTimeMillis();
38         System.out.println("过滤结束...");
39         System.out.println("请求被定位到"+hrequest.getRequestURI()+"所花的时间为:"+(after-before));
40     }
41 
42     @Override
43     public void init(FilterConfig arg0) throws ServletException {
44         config = arg0;
45     }
46 
47 }
复制代码

 

doFilter()方法是拦截器的核心算法

chain.doFilter(request,response)是 将请求依旧发送到目的地址(方行),当不调用该函数时,将不会响应对应的servlet

chain.d0Filter() 的执行是 对用户请求的预处理 与 对服务器相应的后处理的分界线

Filter的配置:(与Servlet的配置极其相似)

在web.xml中增加一下片段:

 

复制代码
<filter>
    <filter-name>log</filter-name>
    <filter-class>com.iot.myjee.LogFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>log</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
复制代码

 

当访问该web应用提供的任意jsp页面时,都会进行一次过滤

Filter与Servlet很相似,只是Filter 的doFilter()中多了一个FilterChain参数,实际上是将多个Servlet的service()中的通用代码放到doFilter()中,提高代码的复用性




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值