從原理帶你掌握Spring MVC攔截處理器知識
摘要:SpringWebMVC的處理器攔截器,類似於Servlet開發中的過濾器Filter,用於處理器進行預處理和後處理。
本文分享自華為雲社群《不講廢話,全程乾貨,0基礎帶你學習SpringMVC攔截處理器》,作者:JavaEdge 。
1 工作原理流程圖
2 Spring Web MVC 的處理器攔截器
- HandlerInterceptor
類似Servlet 開發中的過濾器Filter,用於對處理器進行預處理和後處理。
HandlerInterceptor介面定義瞭如下方法:
2.1 preHandle
該方法將在請求處理之前進行呼叫,只有當該方法返回true時,才會繼續呼叫下一個Interceptor的preHandle(),如果已是最後一個Interceptor就會是呼叫當前請求的Controller
2.2 postHandle
該方法將在請求處理後,DispatcherServlet進行檢視返回渲染之前進行呼叫,可以在這個方法中對Controller處理之後的ModelAndView物件進行操作(比如這裡加入公用資訊以便頁面顯示)
2.3 afterCompletion
該方法也是需要當前對應的Interceptor的preHandle方法的返回值為true時才會執行,該方法將在整個請求結束之後,也就是在DispatcherServlet 渲染了對應的檢視之後執行,用於資源清理。
3 攔截器配置
3.1 針對某種mapping攔截器配置
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
<bean id="handlerInterceptor1"class="springmvc.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2"class="springmvc.intercapter.HandlerInterceptor2"/>
3.2 針對所有mapping配置全域性攔截器
<!--攔截器 -->
<mvc:interceptors>
<!--多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.sss.filter.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.sss.filter.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
4 實踐
使用者訪問其他頁面時,從Seesion中獲取到使用者,未登入則重定向到登入頁面。
Public class LoginInterceptor implements HandlerInterceptor{
@Override
Public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//如果是登入頁面則放行
if(request.getRequestURI().indexOf("login.action")>=0){
return true;
}
HttpSession session = request.getSession();
//如果使用者已登入也放行
if(session.getAttribute("user")!=null){
return true;
}
//使用者沒有登入挑戰到登入頁面
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return false;
}
「其他文章」
- 帶你掌握 C 中三種類成員初始化方式
- 實踐GoF的設計模式:工廠方法模式
- DCM:一個能夠改善所有應用資料互動場景的中介軟體新秀
- 手繪圖解java類載入原理
- 關於加密通道規範,你真正用的是TLS,而非SSL
- 程式碼重構,真的只有複雜化一條路嗎?
- 解讀分散式排程平臺Airflow在華為雲MRS中的實踐
- 透過例項demo帶你認識gRPC
- 帶你聚焦GaussDB(DWS)儲存時遊標使用
- 傳統到敏捷的轉型中,誰更適合做Scrum Master?
- 輕鬆解決研發知識管理難題
- Java中觀察者模式與委託,還在傻傻分不清
- 如何使用Python實現影象融合及加法運算?
- 什麼是強化學習?
- 探索開源工作流引擎Azkaban在MRS中的實踐
- GaussDB(DWS) NOT IN優化技術解密:排他分析場景400倍效能提升
- Java中觀察者模式與委託,還在傻傻分不清
- Java中的執行緒到底有哪些安全策略
- 一圖詳解java-class類檔案原理
- Java中的執行緒到底有哪些安全策略