📜  Servlet过滤器

📅  最后修改于: 2021-01-09 12:46:55             🧑  作者: Mango

Servlet过滤器

过滤器是在请求的预处理和后处理中调用的对象。

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

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

因此维护成本将更少。


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

过滤器的用法

  • 记录所有传入的请求
  • 记录发出请求的计算机的IP地址
  • 转换
  • 资料压缩
  • 加密和解密
  • 输入验证等

过滤器的优势

  • 过滤器可插拔。
  • 一个过滤器不依赖于另一种资源。
  • 减少维护

筛选器API

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

  • 过滤
  • 过滤链
  • FilterConfig

1)过滤接口

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

Method Description
public void init(FilterConfig config) init() method is invoked only once. It is used to initialize the filter.
public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain) doFilter() method is invoked every time when user request to any resource, to which the filter is mapped.It is used to perform filtering tasks.
public void destroy() This is invoked only once when filter is taken out of the service.

2)FilterChain界面

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

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

如何定义过滤器

我们可以定义与servlet相同的过滤器。让我们看一下filter和filter-mapping的元素。





...
...

 

...
...




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

过滤器的简单示例

在此示例中,我们仅显示在请求的后处理之后自动调用过滤器的信息。

index.html

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("
welcome to servlet
"); } }

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





s1
HelloServlet



s1
/servlet1



f1
MyFilter

 

f1
/servlet1