1. 認識攔截器

創(chuàng)新互聯建站-專業(yè)網站定制、快速模板網站建設、高性價比愛輝網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式愛輝網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋愛輝地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。
Spring MVC的攔截器(Interceptor)不是Filter,同樣可以實現請求的預處理、后處理。使用攔截器僅需要兩個步驟:
1.1 實現攔截器
實現攔截器可以自定義實現HandlerInterceptor接口,也可以通過繼承HandlerInterceptorAdapter類,后者是前者的實現類。下面是攔截器的一個實現的例子,目的是判斷用戶是否登錄。如果preHandle方法return true,則繼續(xù)后續(xù)處理。
public class LoginInterceptor extends HandlerInterceptorAdapter {
/**
*預處理回調方法,實現處理器的預處理(如登錄檢查)。
*第三個參數為響應的處理器,即controller。
*返回true,表示繼續(xù)流程,調用下一個攔截器或者處理器。
*返回false,表示流程中斷,通過response產生響應。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
System.out.println("-------------------preHandle");
// 驗證用戶是否登陸
Object obj = request.getSession().getAttribute("username");
if (obj == null || !(obj instanceof String)) {
response.sendRedirect(request.getContextPath() + "/index.html");
return false;
}
return true;
}
/**
*當前請求進行處理之后,也就是Controller 方法調用之后執(zhí)行,
*但是它會在DispatcherServlet 進行視圖返回渲染之前被調用。
*此時我們可以通過modelAndView對模型數據進行處理或對視圖進行處理。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("-------------------postHandle");
}
/**
*方法將在整個請求結束之后,也就是在DispatcherServlet 渲染了對應的視圖之后執(zhí)行。
*這個方法的主要作用是用于進行資源清理工作的。
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
System.out.println("-------------------afterCompletion");
}
}1.2 注冊攔截器
為了使自定義的攔截器生效,需要注冊攔截器到spring容器中,具體的做法是繼承WebMvcConfigurerAdapter類,覆蓋其addInterceptors(InterceptorRegistry registry)方法。最后別忘了把Bean注冊到Spring容器中,可以選擇@Component 或者 @Configuration。
@Component
public class InterceptorConfiguration extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注冊攔截器
InterceptorRegistration ir = registry.addInterceptor(new LoginInterceptor());
// 配置攔截的路徑
ir.addPathPatterns("/**");
// 配置不攔截的路徑
ir.excludePathPatterns("/**.html");
// 還可以在這里注冊其它的攔截器
//registry.addInterceptor(new OtherInterceptor()).addPathPatterns("/**");
}
}1.3 攔截器的應用場景
攔截器本質上是面向切面編程(AOP),符合橫切關注點的功能都可以放在攔截器中來實現,主要的應用場景包括:
2. 原理
2.1 工作原理
攔截器不是Filter,卻實現了Filter的功能,其原理在于:
2.2 攔截器工作流程
一個攔截器,只有preHandle方法返回true,postHandle、afterCompletion才有可能被執(zhí)行;如果preHandle方法返回false,則該攔截器的postHandle、afterCompletion必然不會被執(zhí)行。
假設我們有兩個攔截器,例如叫Interceptor1和Interceptor2,當一個請求過來,正常的流程和中斷的流程分別如下。
2.2.1正常流程
注意兩個攔截器在執(zhí)行preHandle方法和執(zhí)行postHandle、afterCompletion方法時,順序是顛倒的。
2.2.2 中斷流程
假設執(zhí)行Interceptor2.preHandle中報錯,那么流程被中斷,之前被執(zhí)行過的攔截器的afterCompletion仍然會執(zhí)行。在本例中,即執(zhí)行了Interceptor1.afterCompletion。
1. Interceptor1.preHandle 2. Interceptor2.preHandle //中間流程被中斷,不再執(zhí)行 3. Interceptor1.afterCompletion
2.3 和Filter共存時的執(zhí)行順序
攔截器是在DispatcherServlet這個servlet中執(zhí)行的,因此所有的請求最先進入Filter,最后離開Filter。其順序如下。
Filter->Interceptor.preHandle->Handler->Interceptor.postHandle->Interceptor.afterCompletion->Filter
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯。
當前標題:在spring-boot工程中添加springmvc攔截器
標題來源:http://www.chinadenli.net/article8/igpoop.html
成都網站建設公司_創(chuàng)新互聯,為您提供全網營銷推廣、、做網站、標簽優(yōu)化、網站設計、網站排名
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯