亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring MVC攔截器的基本使用方法

發布時間:2020-09-06 09:11:24 來源:腳本之家 閱讀:136 作者:周二 欄目:編程語言

攔截器簡介

Spring MVC 中的攔截器(Interceptor)類似于 Servler 中的過濾器(Filter)。用于對處理器進行預處理和后處理。常用于日志記錄、權限管理、性能監控、通用行為等。

攔截器的實現

Spring MVC 中的攔截器需要我們手動實現和配置。攔截器可以通過以下兩種方式定義

  • 實現 HandleInterceptor 接口,或者繼承該接口的實現類如 HandleInterceptorAdapter 來定義一個攔截器;
  • 實現 WebRequestInterceptor 接口來定義一個攔截器;

HandleInterceptor 接口

我們主要講解下實現 HandleInterceptor 接口來創建攔截器。HandleInterceptor 接口定義了三個方法,分別為 preHandle() , postHandle() , afterCompletion(),我們需要重寫這三個方法,從而來實現我們定義攔截器的目的。

  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handle):該方法在請求處理前調用。Spring MVC 中的攔截器是鏈式調用的,一個請求可以被多個攔截器攔截,但是 Interceptor 會根據被聲明的次序依次被調用執行,而不會同時去攔截。而且所有 Interceptor 中的 preHandle 函數都會最先被調用,所以這個方法中可以進行一些前置初始化操作或者是對當前請求的預處理,或者設置一些判斷來決定該請求是否執行下去。該方法的返回值是布爾值,當它返回 true 時,之后的 Interceptor 和 controller 都不會執行下去了;當它返回 false 時,就會繼續調用下一個 Interceptor 的 preHandle 方法或者處理當前請求的 Controller。
  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView):該方法只有在 perHandle 方法返回值為 true 時,在 Controller 執行完當前請求后才會執行。咋一看好像和之后要介紹的 afterCompletion 方法沒有不同,但是這個方法會在 DispatcherServlet 進行視圖渲染之前被調用,所以咱們可以在這個方法中對 Controller 處理之后的 ModelAndView 對象進行操作。
  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex):該方法在整個請求結束后,也就是 DispatcherServlet 渲染了對應視圖之后執行,這個方法的主要作用是用于進行資源清理的工作。

假設我們現在定義了兩個攔截器,xml 配置文件中配置順序如下內容如下:

<!-- 攔截器1 -->
<mvc:interceptor>
 <!--配置攔截器的作用路徑-->
 <mvc:mapping path="/**"/>
 <bean class="com.jojo.test.interceptor.Intercptor1"/>
</mvc:interceptor>
<!--攔截器2-->
<mvc:interceptor>
 <mvc:mapping path="/hello"/>
 <bean class="com.jojo.test.interceptor.Interceptor2"/>
</mvc:interceptor>

那么這兩個攔截器中的處理方法和請求的處理方法的順序如下圖:

Spring MVC攔截器的基本使用方法

實際應用舉例

實現開發中,我們會要求一些頁面需要登錄后才能訪問。未登錄狀態是無法得到訪問權限的。這一小功能我們可以直接通過安全框架,類似 Spring Security 或者 shiro 來實現,不過我們現在利用 Spring MVC 這一功能來實現一下:

public class LoginInterceptor implements HandlerInterceptor {
 
 public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
  
  User user = (User) httpServletRequest.getSession().getAttribute("user");

  if (user == null) {
   // 用戶未登錄,重定向到登錄頁
   httpServletResponse.sendRedirect("/login");
   return false;
  }

  return true;
 }

 public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
  
  }
 }

 public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

 }
}

我們還需要在 spring-mvc 中配置攔截器

<mvc:interceptors>
 <mvc:interceptor>
  <mvc:mapping path="/**"/>
  <mvc:exclude-mapping path="/static/**"/>
  <mvc:exclude-mapping path="/login"/>
  <bean class="com.jojo.test.interceptor.LoginInterceptor"/>
 </mvc:interceptor>
</mvc:interceptors>

相關配置說明:

  • mvc:interceptor:定義一個攔截器
    • mvc:mapping:定義需要被攔截的路徑
    • mvc:exclude-mapping:定義需要排除攔截的請求路徑
    • bean class:指定攔截器對象

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

马龙县| 沁水县| 绩溪县| 水城县| 伊吾县| 哈巴河县| 游戏| 晋宁县| 溆浦县| 临沧市| 山丹县| 谢通门县| 龙川县| 全椒县| 文山县| 绍兴市| 繁峙县| 正阳县| 武清区| 上高县| 景谷| 诸暨市| 武汉市| 民乐县| 陈巴尔虎旗| 孟州市| 鄂州市| 青州市| 浦县| 鹤壁市| 开阳县| 济宁市| 都江堰市| 确山县| 双辽市| 郴州市| 淳安县| 杭锦旗| 保亭| 咸宁市| 镇宁|