SpringMVC框架|Interceptor攔截器


一、過濾器和攔截器的區別

攔截器在實現上是基於Java的反射機制,屬於面向切面編程的一種運用。 可以使用Spring的依賴注入進行業務操作。一個攔截器實例在一個controller生命週期之內可以多次調用。但是隻能對controller請求進行攔截,對其他的一些比如直接訪問靜態資源的請求無法攔截處理。

(1)使用範圍不同

  • JavaWeb中學過的過濾器(Filter)是Java EE體系中的組件。
  • 攔截器(Interceptor)是SpringMVC框架中的組件。

(2)執行時機不同

  • 過濾器是運行在所有Servlet之前
  • 攔截器是運行在DispatcherServlet之後

通常在使用Spring MVC框架後,推薦使用攔截器來實現登錄的處理。

二、演示使用攔截器

1.單個攔截器的執行順序

(1)定義一個攔截器

package com.gql.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
 * 類說明:
 *		攔截器1
 * @guoqianliang1998.
 */
public class MyInterceptor1 implements HandlerInterceptor {

	//在handler之前執行
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("處理器執行前...");
		return true;//放行
	}


	//在handler返回MovelAndView後執行
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("處理器執行中...");
	}

	//在handler返回MovelAndView後執行 最終執行
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("處理器執行後...");
	}
}

(2)配置攔截器

在SpringMVC配置中進行如下配置,其中/**表示攔截多級目錄

	<!-- 自定義攔截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<bean class="com.gql.interceptor.MyInterceptor1"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

(3)Handler處理器

package com.gql.upload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.gql.ex.MyException;
import com.gql.pojo.User;

@Controller
@RequestMapping("/user")
public class UserController {	
	@RequestMapping("/add")
	public String add(User user) throws MyException{
		System.out.println("添加用戶成功");
		return "success";
	}
}

上面的測試執行後,運行順序如下,
在這裏插入圖片描述
單個攔截器的執行順序如下圖:
在這裏插入圖片描述

2.多個攔截器的執行順序

總結:

  • 攔截器的perHandle()方法順序執行
  • 攔截器的postHandle()方法afterCompletion方法逆序執行
  • 這裏說的順序和倒序是指SpringMVC配置文件中的攔截器的配置順序。

在這裏插入圖片描述

發佈了427 篇原創文章 · 獲贊 1124 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章