javaweb中的过滤器学习总结(2)---Filter过滤器链和过滤器的生命周期

1、Filter链

<1>web开发中可以写多个Filter,每个Filter有自己需要过滤的URL,当每个过滤器的URL不相同时,这些过滤器互不相关。
<2>当多个过滤器的URL相同时,这多个过滤器就形成了Filter链,具体过滤的顺序由这多个过滤器在web.xml中的注册顺序而定。

2、Filter的生命周期

<1>Filter的创建:
Filter的创建和销毁由web服务器负责,web应用程序启动时,web服务器会去创建Filter的实例对象,并调用init()方法,为后期的过滤拦截做好准备。Filter对象只会创建一次,init()也只会执行一次,通过init方法的参数可以获得当前Filter配置信息的FilterConfig对象,以便获得一些初始化参数,这一些我们会在接下来单独总结。

<2>Filter的销毁,在Filter的生命周期里。Filter只会被销毁一次,destroy()方法也只会被调用一次。

3、FilterConfig接口

我们在学习Filter的init()方法时,我们知道init()方法会传递一个FilterConfig对象,我们可以通过这个FilterConfig的对象来得到在Filter注册时的一些初始化参数。

初始化参数可以用到什么地方呢?我们在使用Filter时可以能会用到一些特定的参数,比如登录验证中,我们没有登录,既不能去访问成功之后的资源页面(也就是我们前面提到的视频资源等等),也不能去访问其他的页面,这时候我们就可以去定义一个初始化参数,里面包含所有的资源页面,只要不登录,这个参数中的页面都不能去访问,这样做可以减少代码量。

具体可用的方法为:
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。

我们来看一个Filter的web.xml的注册信息:

             <filter>
                  <filter-name>FilterDemo02</filter-name>
                   <filter-class>me.gacl.web.filter.FilterDemo02</filter-class>
                   <!--配置FilterDemo02过滤器的初始化参数-->
                   <init-param>
                       <description>配置FilterDemo02过滤器的初始化参</description>
                       <param-name>name</param-name>
                       <param-value>gacl</param-value>
                   </init-param>
                   <init-param>
                       <description>配置FilterDemo02过滤器的初始化参</description>
                       <param-name>like</param-name>
                      <param-value>java</param-value>
                   </init-param>
             </filter>

              <filter-mapping>
                   <filter-name>FilterDemo02</filter-name>
                   <!--“/*”表示拦截所有的请求 -->
                   <url-pattern>/*</url-pattern>
              </filter-mapping>

我们看看如何获取这些初始化参数:

package me.gacl.web.filter;

import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FilterDemo02 implements Filter {

    /* 过滤器初始化
     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("----过滤器初始化----");

        //得到过滤器的名字
        String filterName = filterConfig.getFilterName();
        //得到在web.xml文件中配置的初始化参数
        String initParam1 = filterConfig.getInitParameter("name");
        String initParam2 = filterConfig.getInitParameter("like");
        //返回过滤器的所有初始化参数的名字的枚举集合。
        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();

        System.out.println(filterName);
        System.out.println(initParam1);
        System.out.println(initParam2);
        while (initParameterNames.hasMoreElements()) {
            String paramName = (String) initParameterNames.nextElement();
            System.out.println(paramName);
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("FilterDemo02执行前!!!");
        chain.doFilter(request, response);  //让目标资源执行,放行
        System.out.println("FilterDemo02执行后!!!");
    }

    @Override
    public void destroy() {
        System.out.println("----过滤器销毁----");
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值