1.實作攔截器
1.寫一個攔截器
繼承HandlerInterceptor
preHandle:
呼叫時間: Controller方法處理之前【也就是路徑跳轉之前】;
執行順序: 鏈式Intercepter情況下,Intercepter按照宣告的順序一個接一個執行;
回傳值: 回傳值為true,則繼續執行,false中斷執行,生成時默認false;
應用場景:登陸驗證之類的
postHandle:
呼叫前提: preHandle回傳true;
呼叫時間: Controller方法處理完之后,DispatcherServlet進行視圖的渲染之前,也就是說在這個方法中你可以對ModelAndView進行操作
執行順序: 鏈式Intercepter情況下,Intercepter按照宣告的順序倒著執行,
備注: postHandle雖然post打頭,但post、get方法都能處理
afterCompletion:
呼叫前提:preHandle回傳true
呼叫時間:DispatcherServlet進行視圖的渲染之后
應用場景:多用于清理資源,統一日志處理,統一例外處理
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//獲取session
HttpSession session = request.getSession();
//獲取session中的用戶
UserDTO user = (UserDTO) session.getAttribute("user");
//判斷用戶是否存在
if(user == null){
//不存在并;攔截
response.setStatus(401);
return false;
}
//存在,保存用戶到TheadLocal放行
UserHolder.saveUser(user);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserHolder.removeUser();
}
}
2.開啟攔截器
WebMvcConfigurer
order:決定攔截器執行的順序
初始值都為0,不設定按照添加順序執行
添加后,最先執行的是order(0)
@Configuration
public class MVCConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.excludePathPatterns("/user/code",
"/user/login",
"/shop/**",
"/upload/**",
"/shop-type/**",
"/shop/**",
"/blog/hot",
"/voucher/**",
"/user/me"
).order(1);}
}
2.攔截器型別(有待考證)
HandlerInterceptor類: 三個方法都必須繼承
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;
}
多個攔截器的執行順序:
HandlerInterceptorAdapter類:可以選擇性繼承三個方法中的一個
public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {
//選擇需要的方法
}
3.攔截器和spring容器的先后執行順序

4.過濾器和攔截器的區別
原文鏈接:https://blog.csdn.net/nigulasizp/article/details/125322507
1、實作原理不同 過濾器和攔截器底層實作方式大不相同,過濾器 是基于函式回呼的,攔截器 則是基于Java的反射機制(動態代理)實作的,
2、使用范圍不同 我們看到過濾器 實作的是 javax.servlet.Filter 介面,而這個介面是在Servlet規范中定義的,也就是說過濾器Filter 的使用要依賴于Tomcat等容器,導致它只能在web程式中使用, 而攔截器(Interceptor) 它是一個Spring組件,并由Spring容器管理,并不依賴Tomcat等容器,是可以單獨使用的,不僅能應用在web程式中,也可以用于Application、Swing等程式中,
3、觸發時機不同 過濾器Filter是在請求進入容器后,但在進入servlet之前進行預處理,請求結束是在servlet處理完以后,攔截器 Interceptor 是在請求進入servlet后,在進入Controller之前進行預處理的,Controller 中渲染了對應的視圖之后請求結束,
4、攔截的請求范圍不同 過濾器Filter執行了兩次,攔截器Interceptor只執行了一次,這是因為過濾器幾乎可以對所有進入容器的請求起作用,而攔截器只會對Controller中請求或訪問static目錄下的資源請求起作用,
5、注入Bean情況不同 這是因為加載順序導致的問題,攔截器加載的時間點在springcontext之前,而Bean又是由spring進行管理,(所以攔截器中注入不了Bean)
6、控制執行順序不同 過濾器用@Order注解控制執行順序,通過@Order控制過濾器的級別,值越小級別越高越先執行, 攔截器默認的執行順序,就是它的注冊順序,也可以通過Order手動設定控制,值越小越先執行
Filter的執行順序在Interceptor之前,具體的流程見下圖

5.攔截器的原理
攔截器Interceptor 的攔截功能是基于Java的反射機制(動態代理)實作的,
原文地址:http://hzhcontrols.com/new-1239027.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/529843.html
標籤:Java
上一篇:將std::bind轉換為std::function?
下一篇:day13-Servlet03
