一、攔截器的作用
將堆內存SpringMVC使用攔截器對請求進行攔截處理,以實現特定的功能。
二、怎麼使用攔截器
1、自定義一個實現HandlerInterceptor接口的類並實現接口中定義的抽象方法,如下代碼:
package com.jd.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
//該方法在Handler Method之前被調用。
//作用:常用於實現權限。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle");
return true;//true,則調用後續的攔截器和Handler Method; false,則不會調用後續的攔截器和Handler Method。
}
//該方法在Handler Method之後,渲染視圖之前被調用。
//作用:常用於對請求域中的屬性或視圖做出修改。
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
//該方法在渲染視圖之後被調用。
//作用:常用於釋放資源。
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion");
}
}
2、配置攔截器:
① 所有請求:
<mvc:interceptors>
<bean class="com.jd.interceptor.Interceptor"></bean>
</mvc:interceptors>
② 特定請求:
<mvc:interceptors>
<mvc:interceptor>
<!--
mvc:exclude-mapping用於設置不攔截哪些路徑的請求;mvc:mapping用於設置攔截哪些路徑的請求,如下例子:
/userinfo只攔截/userinfo請求,不攔截/userinfo/toView.do請求
/userinfo/*攔截/userinfo/xxx請求
-->
<mvc:mapping path="/userinfo/*"/>
<bean class="com.jd.interceptor.Interceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
執行結果如下:
三、執行順序
1、執行總體順序如下圖:
DispatcherServlet.java部分源代碼如下:
2、三個方法何時執行:
① preHandle方法在執行順序的第一步applyPreHandle方法中調用:
② postHandle方法在執行順序的第三步applyPostHandle方法中調用:
③ afterCompletion方法在執行順序的第五步triggerAfterCompletion方法中調用: