读书人

拦截器(interceptor)跟filter小结

发布时间: 2012-12-21 12:03:49 作者: rapoo

拦截器(interceptor)和filter小结

<package name="systemPackage" extends="struts-default,json-default"abstract="true"><interceptors><interceptor name="status" /><interceptor-stack name="systemStack"><interceptor-ref name="status"><param name="loginResult">redirectLogin</param><param name="excludeActions">image,login</param></interceptor-ref><interceptor-ref name="paramsPrepareParamsStack" /></interceptor-stack></interceptors><!-- 配置所有action的默认拦截器 --><default-interceptor-ref name="systemStack" /><global-results><result name="login">/login.jsp</result><result name="redirectLogin" type="redirect">/login.jsp </result></global-results></package>

??

以上是我项目中的代码:

?<interceptors>: 只负责定义,而真正执行须要<default-interceptor-ref? 来引用, 当这个包(systemPackage)被其他包继承的时候,那么其他包都会执行默认的拦截器---default-interceptor-ref?;

当然也可以在特定的action中配置单独的拦截器;

??其中要说明的是:paramsPrepareParamsStack这个拦截器栈是在struts-default.xml中配置过的,是框架固有的,这个拦截器负责一些上传、多选框、参数、验证等 拦截功能.....

?

写过滤器的时候 ,继承AbstractInterceptor就可以了,其中的intercept方法会接受ActionInvocation参数,这个参数是action的调用者,根据它可以获得拦截到的action,结果集,栈,以及调用的上下文...

?

?

以下来自互联网总结:

    拦截器是基于java反射机制的,而过滤器是基于函数回调的。 过滤器依赖与servlet容器,而拦截器不依赖与servlet容器。 拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。 拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。 在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

?

下面是一个filter例子:

?

web.xml配置:<filter>       <filter-name>MyFilter</filter-name>       <filter-class>org.util.filter.MyFilterDispatcher</filter-class>   </filter>     <filter-mapping>       <filter-name>MyFilter</filter-name>       <url-pattern>/*</url-pattern>    </filter-mapping

?

public class MyFilterDispatcher implements Filter {         @Override      public void doFilter(ServletRequest req, ServletResponse res,               FilterChain chain) throws IOException, ServletException {           HttpServletRequest request = (HttpServletRequest) req;           HttpServletResponse response = (HttpServletResponse) res;                      System.out.println("过滤器过滤成功.....");                      /*          String path = request.getServletPath();           if(!"/index.jsp".equals(path)){              //首页不过滤          }          */                     chain.doFilter(req, res);       }         @Override      public void init(FilterConfig arg0) throws ServletException {       }         @Override      public void destroy() {       }     }  

?很明显filter是基于servlet的;

?

在实际项目中,interceptor几乎可以完全替代filter ,我个人比较习惯用interceptor, 如果有filter能做到,而interceptor做不到的地方,希望大家留言说下。。。。。

性能方面interceptor会耗费很多资源。?

?

读书人网 >软件架构设计

热点推荐