拦截器(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,结果集,栈,以及调用的上下文...
?
?
以下来自互联网总结:
?
下面是一个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会耗费很多资源。?
?