編寫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--------------------------
