preHandle: #預先處理,在目標的controller方法執行之前,進行處理
postHandle: #在目標的controller方法執行之後,到達指定頁面之前進行處理
afterCompletion: 在頁面渲染之後進行處理
##方法:
1.Springboot透過實作HandlerInterceptor介面實作攔截器2.透過WebMvcConfigurer實作一個組態類別,再透過@Configuration 註解注入到容器#3 .指定攔截規則以使用者登入為案例,若使用者沒有登入session裡面就沒有使用者的資料,就會轉到首頁登入頁面在正確登入之後,就將reglister儲存到session中,再次存取頁面的時候,登入攔截器就可以找到這個reglister對象,就不需要再攔截到登入介面了.
##
package com.zwz.springbootweb.interceptor; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.websocket.Session; public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object reglister = session.getAttribute("Reglister"); if (reglister != null) { return true; } else { request.setAttribute("msg", "请先登录!"); request.getRequestDispatcher("/").forward(request,response); return false; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }之後透過實作WebMvcConfigurer介面實現一個設定類,在設定類中註入攔截器,最後再透過@Configuration 註解注入設定.並且指定攔截的路徑和需要放行的路徑.
注意:
攔截器 /** 會攔截一切資源,包含靜態資源,需要將靜態資源放行
package com.zwz.springbootweb.config; import com.zwz.springbootweb.interceptor.LoginInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.HiddenHttpMethodFilter; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.util.UrlPathHelper; @Configuration public class WebConfig implements WebMvcConfigurer{ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/loginjudge","/","/retolo","/static/**"); } }# 攔截器的應用場景
1、日誌記錄:記錄請求資訊的日誌,以便進行資訊監控、資訊統計、計算PV(Page VIEW)等。
2、權限檢查:如登入偵測,進入處理器偵測偵測是否登錄,若沒有直接回到登入頁面;
3、效能監控:有時候系統在某段時間莫名其妙的慢,可以透過攔截器在進入處理器之前記錄開始時間,在處理完後記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);
4、通用行為:讀取cookie得到使用者資訊並將使用者物件放入請求,從而方便後續流程使用,還有如提取Locale、Theme資訊等,只要是多個處理器都需要的即可使用攔截器實現。
5、OpenSessionInView:如Hibernate,在進入處理器開啟SESSION,在完成後關閉SESSION。
攔截器與過濾器的區別1、攔截器是基於Java的反射機制的,而過濾器是基於函數回呼。
2、攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3、攔截器只能對ACTION請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4、攔截器可以存取ACTION上下文、值堆疊裡的對象,而過濾器不能存取。
5、在ACTION的生命週期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
6、攔截器可以取得IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裡注入一個service,可以呼叫業務邏輯。
以上是怎麼在Springboot實現攔截器功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!