zoukankan      html  css  js  c++  java
  • Spring filter和拦截器(Interceptor)的区别和执行顺序

    转载自:http://listenup.iteye.com/blog/1559553


    1.Filter过滤器只过滤jsp文件不过滤action请求解决方案

    解决办法:在web.xml中将filter的配置放在struts2配置的前面。


    2.拦截器与Filter的区别 
    Spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:

    使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。

    规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。

    使用的资源不同:同其他的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter则不能。

    深度不同:Filter在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。

    实际上Filter和Servlet极其相似,区别只是Filter不能直接对用户生成响应。实际上Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的复用。 

    filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响 应,它只是修改对某一资源的请求,或者修改从某一的响应。  

    JSR中说明的是,按照多个匹配的Filter,是按照其在web.xml中配置的顺序 来执行的。 

    所以这也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的 DispatcherFilter的前面的原因。因为,它们需要在请求被Struts2框架处理之前,做一些前置的工作。 

    当Filter被调用,并且进入了Struts2的DispatcherFilter中 后,Struts2会按照在Action中配置的Interceptor Stack中的Interceptor的顺序,来调用Interceptor。
     
    参考自:http://www.cnblogs.com/Fskjb/archive/2010/03/27/1698448.html 

    3.servlet、filter、interceptor的执行顺序



        Filter代码:

    Java代码  收藏代码
    1. @Override  
    2.     public void doFilter(ServletRequest servletrequest,  
    3.             ServletResponse servletresponse, FilterChain filterchain)  
    4.             throws IOException, ServletException {  
    5.         System.out.println("in  filter 1.");  
    6.         filterchain.doFilter(servletrequest, servletresponse);  
    7.         System.out.println("outing filter 1");  
    8.     }  

     

     

       interceptor代码:
        @Override

    Java代码  收藏代码
    1. public String intercept(ActionInvocation actioninvocation) throws Exception {  
    2.     System.out.println("in logininterceptor");  
    3.     String result=actioninvocation.invoke();  
    4.     System.out.println("outing logininterceptor");  
    5.     return result;  
    6. }  

     
        action代码:

    Java代码  收藏代码
    1. @Override    
    2.    public String execute() throws Exception {    
    3.        System.out.println("in loginaciton");  
    4.        ActionContext context=ActionContext.getContext();  
    5.        Map<String, Object> session=context.getSession();   
    6.        session.put("userName", userName);    
    7.          
    8.       /* HttpServletRequest request = ServletActionContext. getRequest(); 
    9.        HttpSession session = request.getSession(); 
    10.        session.putValue("userName", userName);*/  
    11.        System.out.println("outing loginaciton");  
    12.        return SUCCESS;    
    13.    }   

     
          

       jsp代码:

    Html代码  收藏代码
    1.  <script type="text/javascript">     
    Html代码  收藏代码
    1. function submitForm(){  
    2.       document.getElementById("form1").submit();   
    3.    }  
    4. </script>  
    5.   
    6.  </head>  
    7.    
    8.  <body>  
    9.    This is Login page. <br>  
    10.    <form action="<%=path %>/login2.action" method="post" id="form1" name="form1">  
    11.       UserName:<input type="text" id="userName" name="userName"/><input type="button" value="submit" onclick="submitForm()" id="submit1" />  
    12.    </form>  
    13.  </body>  
     


       struts.xml

    Xml代码  收藏代码
    1.  <struts>  
    Xml代码  收藏代码
    1. <package name="default" extends="struts-default" namespace="/">    
    2.            
    3.          <interceptors>  
    4.             <interceptor name="MyInterceptor" class="Login.LoginInterceptor"></interceptor>  
    5.                 <interceptor-stack name="myInterceptorStack">  
    6.                     <interceptor-ref name="MyInterceptor"/>  
    7.                     <interceptor-ref name="defaultStack"/>  
    8.                 </interceptor-stack>  
    9.         </interceptors>  
    10.            
    11.             <action name="login2" class="Login.LoginAction">    
    12.                 <result name="success">    
    13.                    /Login/success.jsp    
    14.                 </result>  
    15.                 <interceptor-ref name="myInterceptorStack"></interceptor-ref>  
    16.             </action>    
    17.    
    18.         </package>  
    19.     </struts>  

     
        
    console:
    in  filter 1.
    in logininterceptor
    in loginaciton
    outing loginaciton
    outing logininterceptor
    outing filter 1

     

    3.servlet、filter的执行顺序

    servlet代码:

    Java代码  收藏代码
    1. public void init() throws ServletException {   
    2.     System.out.println("servlet初始化");  
    3.   }   
      
    Java代码  收藏代码
    1. public void doPost(HttpServletRequest request, HttpServletResponse response)          
    Java代码  收藏代码
    1. throws ServletException, IOException {   
    2.       System.out.println("in servlet");  
    3.     response.setContentType("text/html");   
    4.     PrintWriter out = response.getWriter();   
    5.     out   
    6.         .println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");   
    7.     out.println("<HTML>");   
    8.     out.println("    <HEAD><TITLE>A Servlet</TITLE></HEAD>");   
    9.     out.println("    <BODY>");   
    10.     out.print("        This is ");   
    11.     out.print(this.getClass());   
    12.     out.println(", using the POST method");        
    13.        
    14.     out.println("<br>");   
    15.     String x = request.getParameter("x");   
    16.     String y = request.getParameter("y");   
    17.     out.println("x="+x);   
    18.     out.println("<br>");   
    19.     out.println("y="+y);   
    20.     out.println("<br>");   
    21.        
    22.     out.println("    </BODY>");   
    23.     out.println("</HTML>");   
    24.     out.flush();   
    25.     out.close();   
    26.     System.out.println("outing servlet");  
    27.   }   

     

    Java代码  收藏代码
    1. public void destroy(){        
    Java代码  收藏代码
    1. System.out.println("servlet销毁");  
    2.         super.destroy();  
    3.     }  

     console:

    servlet初始化

    in  filter 1.

    in servlet

    before HttpServletRequest

    after HttpServletRequest

    outing servlet

    outing filter 1

    当tomcat容器停止的时候,输出:servlet销毁


  • 相关阅读:
    ExtAspNet应用技巧(二)
    JavaScript继承详解(六)
    ExtAspNet新版本发布,集成Extjs3.0,兼容IE浏览器
    ExtAspNet发展规划
    把Doc文档转换成rtf格式 (转载)
    提高Sql Server性能的10个技巧
    winform中树和数据库关联操作的例子(C#)
    为什么C#没有提供“缺省参数”
    让UML消失一段时间
    把RichTextBox中的文本保存到Sql Server中
  • 原文地址:https://www.cnblogs.com/ycpanda/p/3637312.html
Copyright © 2011-2022 走看看