Servlet过滤器

过滤器是一个对象,它在请求的预处理和后处理时被调用。

它主要用于执行过滤任务,如转换、日志记录、压缩、加密和解密、输入验证等。

Servlet过滤器是可插拔的,即它的条目在web.xml文件中定义,如果我们从web.xml文件中删除过滤器的条目,过滤器将自动被移除,我们不需要更改servlet。

因此,维护成本会降低。

filter.jpg

注意:与Servlet不同,一个过滤器不依赖于另一个过滤器。

过滤器的用途

  • 记录所有传入的请求
  • 记录请求来源计算机的IP地址
  • 转换
  • 数据压缩
  • 加密和解密
  • 输入验证等。

过滤器的优点

  1. 过滤器是可插拔的。
  2. 一个过滤器不依赖于另一个资源。
  3. 维护成本低

过滤器API

像servlet一样,过滤器也有自己的API。javax.servlet包包含了Filter API的三个接口。

  1. Filter
  2. FilterChain
  3. FilterConfig

1) Filter接口

要创建任何过滤器,您必须实现Filter接口。Filter接口为过滤器提供了生命周期方法。

方法描述
public void init(FilterConfig config)init()方法只被调用一次。它用于初始化过滤器。
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)每次用户请求映射到该过滤器的任何资源时,都会调用doFilter()方法。它用于执行过滤任务。
public void destroy()当过滤器退出服务时,只会调用一次此方法。

2) FilterChain接口

FilterChain对象负责调用链中的下一个过滤器或资源。这个对象在Filter接口的doFilter方法中传递。FilterChain接口只包含一个方法:

  1. public void doFilter(HttpServletRequest request, HttpServletResponse response): 它将控制权传递给下一个过滤器或资源。

如何定义过滤器

我们可以像定义servlet一样定义过滤器。让我们看看过滤器和过滤器映射的元素。

<web-app>  
  
<filter>  
<filter-name>...</filter-name>  
<filter-class>...</filter-class>  
</filter>  
   
<filter-mapping>  
<filter-name>...</filter-name>  
<url-pattern>...</url-pattern>  
</filter-mapping>  
  
</web-app>  

为了映射过滤器,我们可以使用url-pattern或servlet-name。url-pattern元素比servlet-name元素有优势,即它可以应用于servlet、JSP或HTML。


过滤器的简单示例

在这个示例中,我们只是显示信息,表明过滤器在请求的后处理之后自动被调用。

index.html

<a href="servlet1">click here</a>  

MyFilter.java

import java.io.IOException;  
import java.io.PrintWriter;  
  
import javax.servlet.*;  
  
public class MyFilter implements Filter{  
  
public void init(FilterConfig arg0) throws ServletException {}  
      
public void doFilter(ServletRequest req, ServletResponse resp,  
    FilterChain chain) throws IOException, ServletException {  
          
    PrintWriter out=resp.getWriter();  
    out.print("filter is invoked before");  
          
    chain.doFilter(req, resp);//sends request to next resource  
          
    out.print("filter is invoked after");  
    }  
    public void destroy() {}  
}  

HelloServlet.java

import java.io.IOException;  
import java.io.PrintWriter;  
  
import javax.servlet.ServletException;  
import javax.servlet.http.*;  
  
public class HelloServlet extends HttpServlet {  
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
  
        response.setContentType("text/html");  
        PrintWriter out = response.getWriter();  
      
        out.print("<br>welcome to servlet<br>");  
          
    }  
  
}  

web.xml

为了定义过滤器,web-app的filter元素必须像servlet一样定义。

<web-app>  
  
<servlet>  
<servlet-name>s1</servlet-name>  
<servlet-class>HelloServlet</servlet-class>  
</servlet>  
  
<servlet-mapping>  
<servlet-name>s1</servlet-name>  
<url-pattern>/servlet1</url-pattern>  
</servlet-mapping>  
  
<filter>  
<filter-name>f1</filter-name>  
<filter-class>MyFilter</filter-class>  
</filter>  
   
<filter-mapping>  
<filter-name>f1</filter-name>  
<url-pattern>/servlet1</url-pattern>  
</filter-mapping>  
  
  
</web-app>  

标签: java, Java Servlet, Java Servlet语言, Java Servlet开发, Java Servlet语法, Java Servlet脚本, Java Servlet教程, Java Servlet入门, Java Servlet入门教程, Java Servlet进阶, Java Servlet宝典, Java Servlet学习, Java Servlet指南, Java Servlet大全