一、攔截器
1、概述
- Spring MVC 的處理器攔截器類似於 Servlet 開發中的過濾器 Filter,用於對處理器進行預處理和後處理。用戶可以自己定義一些攔截器來實現特定的功能。
- 它也是 AOP 思想的具體應用。
- 我們要想自定義攔截器, 要求必須實現:HandlerInterceptor 接口。
2、攔截器鏈(Interceptor Chain)
攔截器鏈就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。
3、SpringMVC攔截器 與 Servlet 中過濾器 Filter的區別
- 過濾器是 servlet 規範中的一部分,任何 java web 工程都可以使用。
- 攔截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
- 過濾器在 url-pattern 中配置了/*之後,可以對所有要訪問的資源攔截。
- 攔截器它是隻會攔截訪問的控制器方法,如果訪問的是 jsp,html,css,image 或者 js 是不會進行攔截的。
二、自定義攔截器
第一步:編寫一個普通類實現 HandlerInterceptor 接口
package cn.lemon.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//在處理器方法執行前執行
System.out.println("MyInterceptor 類中的 perHandle 方法,在處理器方法執行前執行.......");
//return false;//當值爲 false 時,攔截器鏈中斷,不向下執行
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//在處理器方法執行後執行
System.out.println("MyInterceptor 類中的 postHandle 方法,在處理器方法執行後執行。。。。。。。。");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//在 view 跳轉後執行
System.out.println("MyInterceptor 類中的 afterCompletion 方法,在 view 跳轉後執行");
}
}
第二步:在 SpringMVC.xml 中配置攔截器
<!--配置攔截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean id="myInterceptor" class="cn.lemon.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
第三步:測試
jsp 代碼
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首頁</title>
</head>
<body>
<h4>異常測試</h4>
<a href="${pageContext.request.contextPath}/test/interceptor">點擊跳轉</a><br>
</body>
</html>
java 代碼
package cn.lemon.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/interceptor")
public String interceptor() {
System.out.println("Interceptor 執行。。。。");
return "success";
}
}
三、配置攔截器的作用範圍
在 SpringMVC.xml 中配置攔截器
<!-- 配置攔截器的作用範圍 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" /><!-- 用於指定對攔截的 url -->
<mvc:exclude-mapping path=""/><!-- 用於指定排除的 url-->
<bean id="handlerInterceptorDemo1"
class="cn.lemon.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>