自定義的攔截器
- Spring MVC也可以使用攔截器對請求進行攔截處理,使用者可以自定義攔截器來實作特定的功能,自定義的攔截器必須實作HandlerInterceptor接口
- preHandler():這個方法在業務處理器處理請求之前被調用,在該方法中對使用者請求request進行處理。如果程式員決定該攔截器對請求進行攔截處理後還要調用其他的攔截器,或者是業務處理器對進行處理,則傳回true;如果程式員決定不需要再調用其他的元件去處理請求,則傳回false。
/** * 該方法在目标方法之前被調用。 * 若傳回值為true,則繼續調用後續的攔截器和目标方法 * 若傳回值為false,則不會再調用後續的攔截器和目标方法 * * 可以考慮做權限。日志,事務等。 */
- postHandler():這個方法在業務處理器處理完請求後,但是DispatcherServlet向用戶端傳回響應前被調用,在該方法中對使用者請求request進行處理。
/** * 調用目标方法之後,但渲染視圖之前。 * 可以對請求域中的屬性或視圖做出修改。 */
- afterCompletion():這個方法在DispatcherServlet完全處理完請求後被調用,可以在該方法中進行一些資源清理的操作。
/** * 渲染視圖之後被調用。釋放資源。 */
- preHandler():這個方法在業務處理器處理請求之前被調用,在該方法中對使用者請求request進行處理。如果程式員決定該攔截器對請求進行攔截處理後還要調用其他的攔截器,或者是業務處理器對進行處理,則傳回true;如果程式員決定不需要再調用其他的元件去處理請求,則傳回false。
舉個例子:
第一步:建立一個包interceptor用來存放我們自定義的攔截器,并且建立一個FirstInterceptor攔截器類
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYjMyADN1AjM5ATMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
FirstInterceptor.java
package com.springmvc.interceptors;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstInterceptor implements HandlerInterceptor {
/**
* 該方法在目标方法之前被調用。
* 若傳回值為true,則繼續調用後續的攔截器和目标方法
* 若傳回值為false,則不會再調用後續的攔截器和目标方法
*
* 可以考慮做權限。日志,事務等。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("[FirstInterceptor] preHandle");
return true;
}
/**
* 調用目标方法之後,但渲染視圖之前。
* 可以對請求域中的屬性或視圖做出修改。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("[FirstInterceptor] postHandle");
}
/**
* 渲染視圖之後被調用。釋放資源。
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("[FirstInterceptor] afterCompletion");
}
}
第二步:在Springmvc.xml配置這個攔截器
<mvc:interceptors>
<!--配置自定義的攔截器-->
<bean class="com.springmvc.interceptors.FirstInterceptor"></bean>
</mvc:interceptors>
第三步:直接運作之前的界面并且點選任意的< a>标簽
tips:
攔截器的配置
1.首先我們在interceptor包中建立了一個攔截器SecondInterceptor
SecondInterceptor.java
package com.springmvc.interceptors;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SecondInterceptor implements HandlerInterceptor {
/**
* 該方法在目标方法之前被調用。
* 若傳回值為true,則繼續調用後續的攔截器和目标方法
* 若傳回值為false,則不會再調用後續的攔截器和目标方法
*
* 可以考慮做權限。日志,事務等。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("[SecondInterceptor] preHandle");
return true;
}
/**
* 調用目标方法之後,但渲染視圖之前。
* 可以對請求域中的屬性或視圖做出修改。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("[SecondInterceptor] postHandle");
}
/**
* 渲染視圖之後被調用。釋放資源。
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("[SecondInterceptor] afterCompletion");
}
}
2.我們想做的是SecondInterceptor隻會攔截/emps這個handler方法那麼需要這樣配置
<!--配置LocaleChanceInterceptor-->
<mvc:interceptors>
<!--配置自定義的攔截器-->
<bean class="com.springmvc.interceptors.FirstInterceptor"></bean>
<!--配置攔截器(不)作用的路徑-->
<!--這樣配置就能使得SecondInterceptor定向攔截/emps請求-->
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<bean class="com.springmvc.interceptors.SecondInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
3.點選一個有/emps的請求的< a>标簽,這樣會被FirstInterceptor和SecondInterceptor攔截
4.點選一個沒有/emps的請求的< a>标簽,這樣隻會被FirstInterceptor攔截
tips: