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

本文详细介绍了Spring Filter与Interceptor的区别,包括使用范围、规范、资源利用和执行深度等方面,并讨论了它们的执行顺序。Filter是Servlet规范的一部分,主要用于Web程序,而Interceptor则更适用于Spring框架,具备更多灵活性。在Struts2中,Filter先于Interceptor执行,然后按照Interceptor Stack中的配置顺序调用Interceptor。
摘要由CSDN通过智能技术生成

转载自: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。 

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

@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代码:

public String intercept(ActionInvocation actioninvocation) throws Exception {  
    System.out.println("in logininterceptor");  
    String result=actioninvocation.invoke();  
    System.out.println("outing logininterceptor");  
    return result;  
}  

    action代码:

   @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代码:

<script type="text/javascript">     
   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" οnclick="submitForm()" id="submit1" />  
   </form>  
 </body>  

   struts.xml

<struts>  
<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代码:

public void init() throws ServletException {   
    System.out.println("servlet初始化");  
}   
  
public void doPost(HttpServletRequest request, HttpServletResponse response)          
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");  
  }   
 
public void destroy(){        
    System.out.println("servlet销毁");  
    super.destroy();  
}  

 console:

servlet初始化
in  filter 1.
in servlet
before HttpServletRequest
after HttpServletRequest
outing servlet
outing filter 1
当tomcat容器停止的时候,输出:servlet销毁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值