Servlet过滤器

Servlet过滤器是一个可以拦截HTTP请求的Java对象。

servlet过滤器可以拦截servlet、JSP、HTML以及其他静态内容的http请求,如下图所示:

创建servlet过滤器,只需继承javax.servlet.Filter接口,如下所示:

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

public class MyServletFilter 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,过滤器在初次加载时,也将调用init()方法初始化。

当http请求到达时,过滤器可以读取URI,请求报头,请求体等,在过滤器中可以阻塞或继续转发请求。

执行过滤的是doFilter()方法:

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

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

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

如上所示,doFilter()方法中首先读取参数myParam,检查是否等于“block”,如果不是,调用filter.dofilter()方法继续转发请求,否则不调用此方法阻塞请求。

如同Servlet,过滤器中也可输出响应内容,通过使用ServletResponse参数。

示例:

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

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

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

    HttpResponse httpResponse = (HttpResponse) response;
    httpResponse.getWriter().write("来自过滤器");
}

如上所示,将ServletResponse转换为HttpResponse,然后获取PrintWriter输出响应。

web.xml中配置Servlet过滤器

Servlet过滤器需要在web.xml配置后才能使用:

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

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

如上所示,URL以.test-filter结尾的所有请求都将被servlet过滤器拦截,其他的不会受到影响。



浙ICP备17015664号 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载