Servlet过滤器

时间:2020-01-09 10:36:22  来源:igfitidea点击:

Servlet过滤器是一个对象,可以拦截针对Web应用程序的HTTP请求。

servlet过滤器可以拦截对servlet,JSP,HTML文件或者其他静态内容的请求

为了创建一个servlet过滤器,我们必须实现javax.servlet.Filter接口。这是一个示例servlet过滤器实现:

import javax.servlet.*;
import java.io.IOException;

/**

 */
public class SimpleServletFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain filterChain)
    throws IOException, ServletException {

    }

    public void destroy() {
    }
}

首次加载servlet过滤器时,将调用servlet的init()方法,就像servlet一样。

当HTTP请求到达过滤器拦截的Web应用程序时,过滤器可以检查请求URI,请求参数和请求标头,并基于此决定是否要阻止请求或者将请求转发到目标Servlet JSP。等等。

执行拦截的是doFilter()方法。这是一个示例实现:

public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain filterChain)
throws IOException, ServletException {

    String myParam = request.getParameter("myParam");

    if(!"blockTheRequest".equals(myParam)){
        filterChain.doFilter(request, response);
    }
}

注意,doFilter()方法如何检查请求参数myParam,看它是否等于字符串" blockTheRequest"。如果不是,则通过调用filterChain.doFilter()方法将请求转发到请求的目标。如果未调用此方法,则不转发请求,而只是阻止该请求。

如果请求参数" myParam"等于" blockTheRequest",则上面的servlet过滤器只会忽略该请求。我们还可以将不同的响应写回到浏览器。就像使用Servlet一样,只需使用ServletResponse对象即可。

我们可能必须将ServletResponse强制转换为HttpResponse才能从中获取PrintWriter。否则,我们只能通过getOutputStream()获得OutputStream

这是一个例子:

public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain filterChain)
throws IOException, ServletException {

    String myParam = request.getParameter("myParam");

    if(!"blockTheRequest".equals(myParam)){
        filterChain.doFilter(request, response);
        return;
    }

    HttpResponse httpResponse = (HttpResponse) httpResponse;
    httpResponse.getWriter().write("a different response... e.g in HTML");
}

在web.xml中配置Servlet过滤器

在工作之前,我们需要在Web应用程序的web.xml文件中配置servlet过滤器。这是操作方式:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>servlets.SimpleServletFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>*.simple</url-pattern>
</filter-mapping>

通过这种配置,所有以URL结尾的请求都以.simple结尾的请求将被servlet过滤器拦截。所有其他都将保持不变。