您的位置:首页 > 编程语言 > Java开发

Spring filter和拦截器(Interceptor)的区别和执行顺序

2014-03-08 00:58 489 查看
转载自: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代码  


@Override  

    public void doFilter(ServletRequest servletrequest,  

            ServletResponse servletresponse, FilterChain filterchain)  

            throws IOException, ServletException {  

        System.out.println("in  filter 1.");  

        filterchain.doFilter(servletrequest, servletresponse);  

        System.out.println("outing filter 1");  

    }  

 

 

   interceptor代码:

    @Override

Java代码  


public String intercept(ActionInvocation actioninvocation) throws Exception {  

    System.out.println("in logininterceptor");  

    String result=actioninvocation.invoke();  

    System.out.println("outing logininterceptor");  

    return result;  

}  

 

    action代码:

Java代码  


@Override    

   public String execute() throws Exception {    

       System.out.println("in loginaciton");  

       ActionContext context=ActionContext.getContext();  

       Map<String, Object> session=context.getSession();   

       session.put("userName", userName);    

         

      /* HttpServletRequest request = ServletActionContext. getRequest(); 

       HttpSession session = request.getSession(); 

       session.putValue("userName", userName);*/  

       System.out.println("outing loginaciton");  

       return SUCCESS;    

   }   

 

      

   jsp代码:

Html代码  


 <script type="text/javascript">     

Html代码  


function submitForm(){  

      document.getElementById("form1").submit();   

   }  

</script>  

  

 </head>  

   

 <body>  

   This is Login page. <br>  

   <form action="<%=path %>/login2.action" method="post" id="form1" name="form1">  

      UserName:<input type="text" id="userName" name="userName"/><input type="button" value="submit" onclick="submitForm()" id="submit1" />  

   </form>  

 </body>  

 

   struts.xml

Xml代码  


 <struts>  

Xml代码  


<package name="default" extends="struts-default" namespace="/">    

           

         <interceptors>  

            <interceptor name="MyInterceptor" class="Login.LoginInterceptor"></interceptor>  

                <interceptor-stack name="myInterceptorStack">  

                    <interceptor-ref name="MyInterceptor"/>  

                    <interceptor-ref name="defaultStack"/>  

                </interceptor-stack>  

        </interceptors>  

           

            <action name="login2" class="Login.LoginAction">    

                <result name="success">    

                   /Login/success.jsp    

                </result>  

                <interceptor-ref name="myInterceptorStack"></interceptor-ref>  

            </action>    

   

        </package>  

    </struts>  

 

    

console:

in  filter 1.

in logininterceptor

in loginaciton

outing loginaciton

outing logininterceptor

outing filter 1

 

3.servlet、filter的执行顺序

servlet代码:

Java代码  


public void init() throws ServletException {   

    System.out.println("servlet初始化");  

  }   

  

Java代码  


public void doPost(HttpServletRequest request, HttpServletResponse response)          

Java代码  


throws ServletException, IOException {   

      System.out.println("in servlet");  

    response.setContentType("text/html");   

    PrintWriter out = response.getWriter();   

    out   

        .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");   

    out.println("<HTML>");   

    out.println("    <HEAD><TITLE>A Servlet</TITLE></HEAD>");   

    out.println("    <BODY>");   

    out.print("        This is ");   

    out.print(this.getClass());   

    out.println(", using the POST method");        

       

    out.println("<br>");   

    String x = request.getParameter("x");   

    String y = request.getParameter("y");   

    out.println("x="+x);   

    out.println("<br>");   

    out.println("y="+y);   

    out.println("<br>");   

       

    out.println("    </BODY>");   

    out.println("</HTML>");   

    out.flush();   

    out.close();   

    System.out.println("outing servlet");  

  }   

 

Java代码  


public void destroy(){        

Java代码  


System.out.println("servlet销毁");  

        super.destroy();  

    }  

 console:

servlet初始化

in  filter 1.

in servlet

before HttpServletRequest

after HttpServletRequest

outing servlet

outing filter 1

当tomcat容器停止的时候,输出:servlet销毁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: