java web 拦截器与过滤器区别

时间:2020-12-08 13:37:20

什么是拦截器(Interceptor )?

         拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

         在WEB中,它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。这是Webwork中给出的解释。

        拦截器链(InterceptorChain,struts中叫做拦截器栈 InterceptorStack),就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会

按其之前定义的顺序被调用。

什么是过滤器(filter)?

        过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这

之后,过滤器可以作如下的选择:

       1.以常规的方式调用资源(即,调用servlet或JSP页面)。

       2.利用修改过的请求信息调用资源。

       3.调用资源,但在发送响应到客户机前对其进行修改。

       4.阻止该资源调用,将其转到其他的资源,返回一个特定的状态代码或生成替换输出。

两者的区别:

      1.拦截器是基于java的反射机制的,而过滤器是基于函数回调。

      2.拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

      3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用,包括一些静态资源的访问。

      4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

      5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

不说了直接上代码:

拦截器:

[java] view plain copy
  1. public class UserInterceptor extends AbstractInterceptor {  
  2.   
  3.     private static final long serialVersionUID = 1L;  
  4.     private Logger log=LoggerFactory.getLogger(UserInterceptor.class);  
  5.     @Override  
  6.     public String intercept(ActionInvocation invocation) throws Exception {  
  7.         String result;  
  8.           String methodName = invocation.getInvocationContext().getName();  
  9.           log.info(methodName);  
  10.           Object action = invocation.getAction();  
  11.             if(action instanceof UserAction)  
  12.             {  
  13.                 //如果是UserAction  dosomething  
  14.                 UserAction useraction = (UserAction)action;  
  15.                   
  16.             }  
  17.             log.info("调用之前doSomething..........");  
  18.             result=invocation.invoke();//调用被拦截的方法  
  19.             log.info("调用之后doSomething..........");  
  20.             return result;  
  21.     }  
  22.   
  23. }  
struts2配置:

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">  
  3. <struts>   
  4.   <package name="default" extends="struts-default" >  
  5.         <interceptors>  
  6.          <interceptor name="userInterceptor" class="lishuai.interceptor.UserInterceptor"></interceptor>  
  7.          <interceptor-stack name="interceplist">  
  8.            <interceptor-ref name="defaultStack"></interceptor-ref>  
  9.            <interceptor-ref name="userInterceptor"></interceptor-ref>  
  10.          </interceptor-stack>  
  11.         </interceptors>  
  12.           
  13.         <action name="user_*"  class="lishuai.action.UserAction" method="{1}">   
  14.            <interceptor-ref name="interceplist"></interceptor-ref>  
  15.         </action>   
  16.   </package>  
  17.   
  18. </struts>  
注:action配的是个拦截器栈,注意defaultStack是struts2的默认拦截器如果不配置则会覆盖掉struts2的默认拦截器,后果就是模型驱动(ModelDriven<T>)或者属性注入等,会

注入失败。

过滤器:

[java] view plain copy
  1. public class CharacterEncodingFilter implements Filter {  
  2.     /* 
  3.      * 编码方式 
  4.      */  
  5.     private String characterEncoding;  
  6.     /* 
  7.      * 是否启用 
  8.      */  
  9.     private boolean enabled;  
  10.   
  11.     @Override  
  12.     public void destroy() {  
  13.         // TODO Auto-generated method stub  
  14.   
  15.     }  
  16.   
  17.     @Override  
  18.     public void doFilter(ServletRequest request, ServletResponse response,  
  19.             FilterChain chain) throws IOException, ServletException {  
  20.           
  21.         if (enabled || characterEncoding != null) {  
  22.                    request.setCharacterEncoding(characterEncoding);  
  23.                         response.setCharacterEncoding(characterEncoding);  
  24.                     }  
  25.         chain.doFilter(request, response);  
  26.     }  
  27.   
  28.     @Override  
  29.     public void init(FilterConfig config) throws ServletException {  
  30.          characterEncoding = config.getInitParameter("characterEncoding");  
  31.          enabled = "true".equalsIgnoreCase(config.getInitParameter("enabled").trim());  
  32.     }  
  33.   
  34. }  
web.xml配置:

[html] view plain copy
  1. <filter>  
  2.     <filter-name>CharacterEncodingFilter</filter-name>  
  3.     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  4.     <init-param>  
  5.         <param-name>encoding</param-name>  
  6.         <param-value>utf-8</param-value>  
  7.     </init-param>  
  8. </filter>  
  9. <filter-mapping>  
  10.     <filter-name>CharacterEncodingFilter</filter-name>  
  11.     <url-pattern>/*</url-pattern>  
  12. </filter-mapping>  

注: 自己定义的过滤器要放到strtus2的过滤器之前的, 如果放在struts2过滤器之后,你自己的过滤器对action的过滤作用就废了,不会有效!除非你是访问jsp/html,切记。

来源于:http://blog.csdn.net/u014655465/article/details/46826439