詳述攔截器

一、攔截器的作用

將堆內存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方法中調用:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章