1、过滤器概述

过滤器的作用,就是拦截发送到服务端的request/response对象,并且对其进行加工,过滤器具有双向顺序:filter chain (chain 链,束缚)


过滤器被调用的顺序,其实就是web.xml中被定义的顺序:


Browers ==>Filter1 ==>Filter2 ==>Filter3 ==>Web Server 

 

  Web Server ==>Filter3 ==>Filter2 ==>Filter1 ==>Browers


过滤器的定义:



与Servlet相似,过滤器是一些Web应用程序组件,可以绑定到一个Web应用程序中。但是与其他Web应用程序组件不同的是,过滤器是"链"在容器的处理过程中的。这就意味着它们会在servlet处理器之前访问一个进入的请求,并且在外发的响应信息返回到客户前访问这些响应信息。这种访问使得过滤器可以检查并修改请求和响应的内容。



一个很典型的应用:



在西安机保项目中,要求某一些业务请求类型在1-20号之外不允许被用户访问,则可以写一个过滤器,根据当前的系统时间,不允许该类的请求被处理,以及做登入,登出的日志记录等等。



一个Filter类原则上要继承HttpServlet,并且实现javax.servlet.Filter接口,并且实现init()、doFilter()、dostory()三个方法。





2、过滤器放在容器的什么位置?



过滤器放在Web资源之前,可以在请求抵达它所应用的Web资源(可以是一个servlet、一个JSP页面,甚至是一个HTML页面这样的静态内容)之前截获进入的请求,并且在它返回到客户之前截获输出。





3、过滤器的生命周期



实例化:初始化(调用init()方法);



public void init(FilterConfig config) throws ServletException



过滤(调用doFilter()方法,包含过滤器逻辑 ),Servlet会将web.xml里面配置的<param>参数值封装为FilterConfig传入Filter。



public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException



FilterChain的doFilter()方法是用过滤后的请求调用资源的方法,如果不写这个方法,也就不会去调用相应的资源。



销毁(destroy()方法由容器在销毁过滤器实例之前调用 );



public void destroy();






4、配置一个过滤器


在web.xml中进行配置:


<filter> 

 
authenticateFilter</filter-name> 

 

  <filter-class> 

 
com.yinhai.xian.login.fiter.AuthenticateFilter
 

  </filter-class> 

 

  <init-param> 

 
defaultUrl</param-name> 

 
/index.do</param-value> 

 

  </init-param> 

 

  </filter> 

 

  <filter-mapping> 

 
authenticateFilter</filter-name> 

 
*.do</url-pattern> 

 

  </filter-mapping>


5、Filter的使用


参见/xajgyl/javacode/xian/com/yinhai/xian/login/fiter/AuthenticateFilter.java


里面有一个转发的函数:


hsr 为 HttpServletRequest对象实例


hsr.getRequestDispatcher("/timeLimit.jsp").forward(request, response);


request dispatcher的二种传送请求方式



Forward: 将请求从一个servlet传到服务器上的其他资源(servlet、JSP、HTML);



Include: 将静态或动态内容包含在当前servlet中;



获得request dispatcher的二种方式:



ServletRequest.getRequestDispatcher("/timeLimit.jsp") // 相对路径 
 
 
 

   ServletContext.getRequestDispatcher("timeLimit.jsp") // 绝对路径 
 
 
 

   Response.sendRedirect(/servapp/state/login);//要写绝对路径,产生新的请求 
 
 
 

   Forward(req,resp);//在当前路径基础上跳转



两个页面之间跳转的时侯如果需要数据传递,则只能用forward(),因为sendRedirect()重定向会产生一个新的请求。