关于java中的过滤器

来源:互联网 发布:蜻蜓fm电脑软件 编辑:程序博客网 时间:2024/05/16 05:18
        今天接触了一下,过滤器,虽然说以前学习Jsp的时候也稍微看了一下,但是受当时的眼界局限所致,看的昏头昏脑,一知半解。今天重新了解了一下。
        
        过滤器是一个类,实现javax.servlet.Filter这个类(接口),作用如下:
        
        1.在http请求到达指定资源(servlet或者url)之前,拦截到request,并更新request,再提交到指定资源。

        2.在web服务器处理请求之后,发送响应到客户端之前,拦截到response,更新response,再提交到web客户端(浏览器)。

        
        Filter接口有三个抽象方法需要实现:
                
package Filter;
 
import java.io.IOException;
import java.util.Date;
 
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 MyFilter implements Filter{
private String mTitle;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
String testParamString=filterConfig.getInitParameter("Test");
System.out.println("测试参数:"+testParamString);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("Filter1");
chain.doFilter(request, response);
System.out.println("Filter1");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
 
}

        Filter的生命周期:
                Filter实例被创建时候,调用init()方法。
                Filter的过滤实际操作在doFilter()方法中定义。
                Filter实例被销毁的时候,调用destory()方法。


        doFilter方法中,chain.doFilter(request,response)方法调用下一个过滤器,若下一个过滤器不存在,则到达指定资源。在chain.doFilter(request,response)方法前面所写代码用于处理拦截到的request,这段代码在到达指定资源前执行;chain.doFilter(request,response)方法后面所写代码用于处理拦截到的response,这段代码在web服务器响应请求之后,响应(response)到达浏览器之前执行。


        这其中最重要的事doFilter方法的定义。

        过滤器要想起作用,除了编写上面那么一个过滤器类之外,还需要在web.xml部署文件中声明过滤器:
      <filter>
<filter-name>MyFilter</filter-name>
<filter-class>Filter.MyFilter</filter-class>
<init-param>
<param-name>Test</param-name>
<param-value>哈哈哈哈1</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
        解释一下上面的参数:
               <init-param>中定义的事过滤器的初始化参数,在类中可以通过FilterConfig.getinitParamter("");得到这个参数值。

                <url-pattern>中定义的是,所需要拦截的具体路径(可以使任何一个servlet或者url,在或者/*)。
        
        现在知道,过滤器的定义方法和实现servlet有些类似吧。


        最后,在实际的项目中,过滤器的使用很普遍,所以过滤器不会只用一个,可能对于一个路径或者一个servlet有多个过滤器起作用,那么这就组成了一条过滤器链,之前在doFilter()中的chain.doFilter(request,response)方法就是用于一个个过滤器之间的跳转衔接,过滤器链中的过滤器执行顺序和web.xml中过滤器部署先后有关系。
        有时候,如需终止过滤器链,只需要不执行chain.doFilter(request,response)即可,而是重定向到另外的指定页面。









0 0
原创粉丝点击