springmvc--攔截器的preHandler返回false后的執行順序


編寫springmvc中的自定義攔截器

1.實現接口 HandlerInterceptor

package com.kevin.interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyHandlerInterceptor implements HandlerInterceptor{

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("------------------preHandle--------------------------");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        
        System.out.println("------------------postHandle--------------------------");
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("------------------afterCompletion--------------------------");
        
    }

}
package com.kevin.interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyHandlerInterceptor2 implements HandlerInterceptor{

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("------------------preHandle2--------------------------");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        
        System.out.println("------------------postHandle2--------------------------");
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("------------------afterCompletion2--------------------------");
        
    }

}

2.在springmvc-servlet.xml的配置文件中加入攔截器配置

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.kevin.interceptors.MyHandlerInterceptor"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.kevin.interceptors.MyHandlerInterceptor2"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

3.controller

@Controller
@RequestMapping("/demo")
public class AnnotationController {

    /**
     * test annotation springmvc
     * @return
     */
    @RequestMapping("anno")
    public ModelAndView testAnnotation(){
        ModelAndView mv = new ModelAndView("anno");
        mv.addObject("msg", "注解驅動的mvc");
        return mv;
    }
    
}    

4.我的tomcat配置

<build>
        <plugins>
            <!-- 配置Tomcat插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>${tomcat-maven-plugin.version}</version>
                <!-- <tomcat-maven-plugin.version>2.2</tomcat-maven-plugin.version> -->
                <configuration>
                    <port>80</port>
                    <!-- http://localhost:port/path  使用80端口瀏覽器輸入地址可省略-->
                    <path>/</path>
                    <!-- <path>/my-springmvc</path> -->
                </configuration>
            </plugin>
        </plugins>
    </build>

5.debug啟動項目,

在springmvc入口 DispatcherServlet 中加入斷點

chrome瀏覽器  http://localhost/demo/anno.do

 

 

getHandler 方法查找mapper  ,返回handler對象和攔截器數組

執行攔截器前置方法

進入方法內

 

由於 MyHandlerInterceptor2 的 preHandle 方法返回的是 false,執行到攔截器2的preHandler后會進入中間135行的triggerAfterCompletion 方法

此時控制台打印

------------------preHandle--------------------------
------------------preHandle2--------------------------

this.interceptorIndex 的值為1

進入triggerAfterCompletion方法

最終結果為

------------------preHandle--------------------------
------------------preHandle2--------------------------
------------------afterCompletion--------------------------

6.如果將MyHandlerInterceptor2的preHandler的返回值改為true,結果是正常的攔截器執行過程

------------------preHandle--------------------------
------------------preHandle2--------------------------
------------------postHandle2--------------------------
------------------postHandle--------------------------
------------------afterCompletion2--------------------------
------------------afterCompletion--------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM