SpringMVC_23_自定義的攔截器以及攔截器的配置
阿新 • • 發佈:2019-01-10
自定義的攔截器
-
Spring MVC也可以使用攔截器對請求進行攔截處理,使用者可以自定義攔截器來實現特定的功能,自定義的攔截器必須實現HandlerInterceptor介面
-
preHandler():這個方法在業務處理器處理請求之前被呼叫,在該方法中對使用者請求request進行處理。如果程式設計師決定該攔截器對請求進行攔截處理後還要呼叫其他的攔截器,或者是業務處理器對進行處理,則返回true;如果程式設計師決定不需要再呼叫其他的元件去處理請求,則返回false。
/** * 該方法在目標方法之前被呼叫。 * 若返回值為true,則繼續呼叫後續的攔截器和目標方法 * 若返回值為false,則不會再呼叫後續的攔截器和目標方法 * * 可以考慮做許可權。日誌,事務等。 */
-
postHandler():這個方法在業務處理器處理完請求後,但是DispatcherServlet向客戶端返回響應前被呼叫,在該方法中對使用者請求request進行處理。
/** * 呼叫目標方法之後,但渲染檢視之前。 * 可以對請求域中的屬性或檢視做出修改。 */
-
afterCompletion():這個方法在DispatcherServlet完全處理完請求後被呼叫,可以在該方法中進行一些資源清理的操作。
/** * 渲染檢視之後被呼叫。釋放資源。 */
-
舉個例子:
第一步:建立一個包interceptor用來存放我們自定義的攔截器,並且建立一個FirstInterceptor攔截器類
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: