目錄
- 11、攔截器
- 11.1書寫攔截器的步驟
- 一、首先需要在SpringMVC.xml中配置攔截器
- 二、處理完配置檔案進行配置類的書寫書寫的類需要實現HandlerInterceptor介面
- 11.2多個攔截器的執行順序
- ⑴如果每個攔截器的preHandle()都返回true
- ⑵如果某個攔截器的preHandle()返回了false
- 11.1書寫攔截器的步驟
11、攔截器
11.1書寫攔截器的步驟
一、首先需要在SpringMVC.xml中配置攔截器
<!-- 配置攔截器-->
<mvc:interceptors>
<!-- 直接配置攔截器-->
<!-- <bean class="com.qc.interceptor.FirstInterceptor"></bean>-->
<!-- <ref bean="firstInterceptor"/>-->
<!-- 配置精確的攔截器-->
<mvc:interceptor>
<!-- 配置攔截器的路徑-->
<mvc:mapping path="/**"/>
<!-- 配置需要排除的路徑-->
<mvc:exclude-mapping path="/test/abc"/>
<mvc:exclude-mapping path="/"/>
<ref bean="firstInterceptor"></ref>
</mvc:interceptor>
<!--精確配置攔截器二-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/test/abc"/>
<mvc:exclude-mapping path="/"/>
<ref bean="secondInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
上面的程式碼中提到了兩種方法配置攔截器(直接配置,精確配置),更推薦使用精確配置
二、處理完配置檔案進行配置類的書寫書寫的類需要實現HandlerInterceptor介面
SpringMVC的攔截器有三個抽象方法
-
preHandle:控制器方法執行之前執行preHandle(),其boolean型別的返回值表示攔截或放行,返回true為放行,即可以呼叫控制方法;返回false表示攔截,即不可以呼叫控制器方法。
-
postHandle:控制器方法執行之後執行postHandle()
-
afterCompletion:處理萬檢視和模型資料,渲染檢視完畢之後執行
@Component
public class FirstInterceptor implements HandlerInterceptor {
@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");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("FirstInterceptor...afterCompletion");
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
11.2多個攔截器的執行順序
⑴如果每個攔截器的preHandle()都返回true
此時多個攔截器的執行順序和攔截器在SpringMVC配置檔案中的配置順序有關:
preHandle()會按照配置的順序執行,而其它兩個postHandle和afterCompletion會按照配置的逆序執行
⑵如果某個攔截器的preHandle()返回了false
preHandle()返回false和它之前的攔截器的preHanlde()都會執行,postHandle()都不執行,返回false的攔截器之前的攔截器的afterCompletion會執行