玩技术,Geeker
一个原创技术文章分享网站

Java Web Filter学习笔记

简述Filter

Filter是什么?在工作的过程中,我们经常听到Filter这个词,那这货到底是个什么东西呢?这篇文章将对Java Web开发中遇到的Filter进行详细的分析与总结。

Filter,译为过滤器;既然是过滤器,那么主要过滤什么呢?Filter主要对客户端的请求和服务器的响应进行过滤。说直白点就是下面这两个意思:

  • 客户端的请求到达服务器,服务器真正开始处理这个请求之前,要经过Filter的过滤
  • 服务器真正的处理完这个请求,生成响应之后,要经过Filter的过滤,才能将响应发送给客户端

也就是说,我们可以通过Filter技术,对web服务器管理的所有web资源,例如JSP、Servlet、静态图片文件或静态 html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

Filter的工作角色

Filter在请求到达服务器之后和服务器生成响应到客户端之前都会发挥它的作用,我通过下图来看看Filter的工作角色:

JSP Filter

Filter就好比在一条处理链上,依次排开,Request和Response依次经过Filter的处理。这里就使用了《责任链模式》。通过上图,我们可以很清楚的知道Filter的作用位置和角色。明白了这儿以后,接下来看看如何创建Filter,以及如何使用Filter。

创建Filter的步骤

创建Filter和创建Servlet类似,主要分为以下两步:

  • 创建Filter处理类
  • 在web.xml文件中配置Filter

下面就从上面的两步进行详细的总结,并通过实际的例子进行分析。

创建Filter类

创建Filter类必须要实现javax.servlet.Filter接口,在这个接口中主要定义了以下三个方法:

  • void init(FilterConfig config);用于完成Filter的初始化
  • void destroy();用于Filter销毁前,完成某些资源的回收
  • void doFilter(ServletRequest request, ServletResponse response, FilterChain chain);实现过滤功能,对每个请求及响应进行拦截和处理

下面就实现一个Filter类,对每个到达服务器的请求、以及服务器的响应进行日志记录。具体的Filter类实现如下:

public class LogFilter implements Filter
{
    private FilterConfig config;

    public void init(FilterConfig config)
    {
        this.config = config;
    }

    public void destroy()
    {
        this.config = null;
    }

    // 这个方法是Filter的核心方法
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException
    {
        // 对用户的请求进行处理
        ServletContext context = this.config.getServletContext();
        long begin = System.currentTimeMillis();

        // 输出过滤信息
        System.out.println("开始过滤...");
        HttpServletRequest hRequest = (HttpServletRequest)request;
        System.out.println("Filter已经截获到用户请求的地址:" + hRequest.getServletPath());

        // 处理完以后,将请求交给下一个Filter或者Servlet处理
        chain.doFilter(request, response);

        // 对服务器的响应进行处理
        long end = System.currentTimeMillis();
        System.out.println("过滤结束");
        System.out.println("请求被定为到:" + hRequest.getRequestURI() + "; 所花费的时间为:" + (end - begin));
    }
}

在上面的代码中,doFilter方法是最重要的,实现该方法就可实现对用户请求进行预处理,也可实现对服务器响应进行后处理——它们的分界线为是否调用了chain.doFilter(),执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。

配置Filter

同开发Servlet一样,写完了类,接下来就是配置了,我们需要在web.xml文件中配置Filter。具体的配置和Servlet配置如出一辙。

<filter>
    <filter-name>log</filter-name>
    <filter-class>com.jellythink.practise.LogFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>log</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

上面配置中比较重要的就是url-patterndispatcher了。

  • 通过配置url-pattern,我们就可以控制对哪些URL进行过滤,哪些URL不进行过滤
  • 通过配置dispatcher,可以指定以哪种方式访问资源可以被Filter拦截;对于dispatcher可以配置以下值:
    • REQUEST,默认为REQUEST;当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcherinclude()forward()方法访问时,那么该过滤器就不会被调用
    • INCLUDE;如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用;例如:<jsp:include file="/.."/>
    • FORWARD;如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用;例如:<jsp:forward page="" />或通过page指令的errorPage转发页面<%@ page errorPage="error.jsp" %>
    • ERROR;如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用

总结

在Web开发中,Filter是一个非常重要的概念;在后续的学习中,我们会发现很多优秀的框架都会用到Filter这个特性,从而实现对客户端请求的拦截。虽然这篇文章总结的很浅显,没有多少深的东西,但是学习都有一个过程,由浅入深。好了,这篇文章到此结束,谢谢各位的捧场。

果冻想-一个原创技术文章分享网站。

2015年12月12日 于呼和浩特。

打赏

未经允许不得转载:果冻想 » Java Web Filter学习笔记

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

在这里玩技术,享受技术带来的疯狂

捐赠名单关于果冻