<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Spring MVC</span><span style="font-family: 宋體; background-color: rgb(255, 255, 255);">也可以使用攔截器對請求進行攔截處理,使用者 可以自定義攔截器來實作特定的功能,自定義的攔截器必須實作</span><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(255, 0, 0); background-color: rgb(255, 255, 255);">HandlerInterceptor</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">接口</span>
① preHandle():這個方法在業務處理器處理請求之前被調用,在該方法中對使用者請求 request 進行處理。如果程式員決定該攔截器對請求進行攔截處理後還要調用其他的攔截器,或者是業務處理器去進行處理,則傳回true;如果程式員決定不需要再調用其他的元件去處理請求,則傳回false。
② postHandle():這個方法在業務處理器處理完請求後,但是DispatcherServlet 向用戶端傳回響應前被調用,在該方法中對使用者請求request進行處理。
③ afterCompletion():這個方法在 DispatcherServlet 完全處理完請求後被調用,可以在該方法中進行一些資源清理的操作。
1.1. 執行順序
1.2. 示例
InterceptorController.java
package com.ibigsea.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class InterceptorController {
@RequestMapping("/interceptor")
public String interceptor(){
System.out.println("controller interceptor");
return "helloworld";
}
}
OneInterceptor.java
package com.ibigsea.springmvc.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 OneInterceptor implements HandlerInterceptor {
/**
* 該方法在執行目标方法之前被調用.
*
* 若傳回值為 true, 則繼續調用後續的攔截器和目标方法.
* 若傳回值為 false, 則不會再調用後續的攔截器和目标方法.
* 并執行 目前攔截器 前面執行過 preHandle 攔截器的 afterCompletion()方法
*
* 可以 做權限,日志,事務等操作.
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("one interceptor preHandle");
return true;
}
/**
* 執行目标方法之後, 在渲染視圖之前,
* 并且 preHandle 傳回為true ,調用該方法
*
* 可以對請求域中的屬性或視圖做出修改.
* 可以 添加一些公共的資訊 比如目前時間 之類
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("one interceptor postHandle");
}
/**
* 渲染視圖之後 被調用該方法,可以做釋放資源等操作
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("one interceptor afterCompletion");
}
}
TwoInterceptor.java
package com.ibigsea.springmvc.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 TwoInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("two interceptor preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("two interceptor preHandle");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("two interceptor afterCompletion");
}
}
Spring-mvc.xml:
<mvc:interceptors>
<!-- 配置自定義的攔截器 -->
<bean id="oneInterceptor" class="com.ibigsea.springmvc.interceptor.OneInterceptor"/>
<bean id="twoInterceptor" class="com.ibigsea.springmvc.interceptor.TwoInterceptor"/>
</mvc:interceptors>
運作結果:
one interceptor preHandle
two interceptor preHandle
controller interceptor
two interceptor preHandle
one interceptor postHandle
two interceptor afterCompletion
one interceptor afterCompletion
one interceptor preHandle
two interceptor preHandle