1. 程式人生 > >springMVC3學習(七)--Interceptor攔截器

springMVC3學習(七)--Interceptor攔截器

spring為我們提供了:org.springframework.web.servlet.HandlerInterceptor介面,

org.springframework.web.servlet.handler.HandlerInterceptorAdapter介面卡,

實現這個介面或繼承此類,可以非常方便的實現自己的攔截器。

有以下三個方法:

Action之前執行

[java]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. public
     boolean preHandle(HttpServletRequest request,  
  2.             HttpServletResponse response, Object handler)  

生成檢視之前執行

[java]  view plain  
copy
  在CODE上檢視程式碼片 派生到我的程式碼片
  1. public void postHandle(HttpServletRequest request,  
  2.             HttpServletResponse response, Object handler, ModelAndView modelAndView)  

最後執行,可用於釋放資源

[java]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. public void afterCompletion(HttpServletRequest request,  
  2.             HttpServletResponse response, Object handler, Exception e)  

分別實現預處理、後處理(呼叫了Service並返回ModelAndView,但未進行頁面渲染)、返回處理(已經渲染了頁面)

在preHandle中,可以進行編碼、安全控制等處理;

在postHandle中,有機會修改ModelAndView;

在afterCompletion中,可以根據ex是否為null判斷是否發生了異常,進行日誌記錄。

引數中的Object handler是下一個攔截器。


如何使用攔截器

自定義一個攔截器,要實現HandlerInterceptor介面:

[java]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. public class MyInterceptor implements HandlerInterceptor {...}  

在springMVC的配置檔案中配置有三種方法

一、攔截所有URL

[html]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. <mvc:interceptors>  
  2.     <bean class="com.itmyhome.MyInterceptor" />  
  3. </mvc:interceptors>  

二、攔截匹配的URL

[html]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. <mvc:interceptors>  
  2.     <mvc:interceptor>  
  3.         <mvc:mapping path="/login" />  
  4.         <bean class="com.itmyhome.MyInterceptor"></bean>  
  5.     </mvc:interceptor>  
  6. </mvc:interceptors>  

三、HandlerMappint上的攔截器

[html]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  
  2.     <property name="interceptors">  
  3.         <list>  
  4.             <bean class="com.itmyhome.MyInterceptor"></bean>  
  5.         </list>  
  6.     </property>  
  7. </bean>  

如果使用了<mvc:annotation-driven />, 它會自動註冊DefaultAnnotationHandlerMapping 與

AnnotationMethodHandlerAdapter 這兩個bean,所以就沒有機會再給它注入interceptors屬性,就無法指定攔截器。

當然我們可以通過人工配置上面的兩個Bean,不使用 <mvc:annotation-driven />,

就可以給interceptors屬性注入攔截器了。


攔截器MyInterceptor類

[java]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. import javax.servlet.http.HttpServletRequest;  
  2. import javax.servlet.http.HttpServletResponse;  
  3. import org.springframework.web.servlet.HandlerInterceptor;  
  4. import org.springframework.web.servlet.ModelAndView;  
  5.   
  6. public class MyInterceptor implements HandlerInterceptor {  
  7.   
  8.     public void afterCompletion(HttpServletRequest request,  
  9.             HttpServletResponse response, Object handler, Exception e)  
  10.             throws Exception {  
  11.         System.out.println("******afterCompletion******");  
  12.   
  13.     }  
  14.   
  15.     public void postHandle(HttpServletRequest request,  
  16.             HttpServletResponse response, Object handler, ModelAndView arg3)  
  17.             throws Exception {  
  18.         System.out.println("******postHandle******");  
  19.   
  20.     }  
  21.   
  22.     /** 
  23.      * 如果返回false 從當前攔截器往回執行所有攔截器的afterCompletion方法,再退回攔截器鏈 如果返回true 
  24.      * 執行下一個攔截器,直到所有攔截器都執行完畢 再執行被攔截的Controller 
  25.      * 然後進入攔截器鏈從最後一個攔截器往回執行所有攔截器的postHandle方法 
  26.      * 接著依舊是從最後一個攔截器往回執行所有攔截器的afterCompletion方法 
  27.      */  
  28.     public boolean preHandle(HttpServletRequest request,  
  29.             HttpServletResponse response, Object handler) throws Exception {  
  30.         System.out.println("******preHandle******");  
  31.         return true;  
  32.     }  
  33. }  

spring配置檔案

[html]  view plain  copy   在CODE上檢視程式碼片 派生到我的程式碼片
  1. <!-- 攔截所以URL  
  2. <mvc:interceptors>  
  3.     <bean class="com.itmyhome.MyInterceptor" />  
  4. </mvc:interceptors>  
  5.  -->  
  6.  <!-- 攔截匹配URL -->  
  7. <mvc:interceptors >  
  8.     <mvc:interceptor>  
  9.         <mvc:mapping path="/login" />  
  10.         <bean class="com.itmyhome.MyInterceptor"></bean>  
  11.     </mvc:interceptor>  
  12. </mvc:interceptors>  
  13.   
  14. <!-- HandlerMappint上的攔截器  
  15. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">  
  16.     <property name="interceptors">  
  17.         <list>  
  18.             <bean class="com.itmyhome.MyInterceptor"></bean>  
  19.         </list>  
  20.     </property>  
  21. </bean>-->  
  22. 相關推薦

    springMVC3學習()--Interceptor攔截

    spring為我們提供了:org.springframework.web.servlet.HandlerInterceptor介面, org.springframework.web.servlet.handler.HandlerInterceptorAdapter介面卡, 實現這個介面

    CXF對Interceptor攔截的支持

    creat 自定義消息 jaxws out super 構造 imp factory odin 前面在Axis中介紹過Axis的Handler,這裏CXF的Interceptor就和Handler的功能類似。在每個請求響應之前或響應之後,做一些事情。這裏的Intercep

    SpringMVC中使用Interceptor攔截

    lis elm auto let 發生 ins 系列 number ted 詳見:http://elim.iteye.com/blog/1750680 SpringMVC 中的Interceptor 攔截器也是相當重要和相當有用的,它的主要作用是攔截用戶的請求並進行相應的處

    spring boot 學習(十二)攔截實現IP黑名單

    ppi html .html 日期類 dpa asp tails 我們 req 攔截器實現IP黑名單 前言 最近一直在搞 Hexo+GithubPage 搭建個人博客,所以沒怎麽進行 SpringBoot 的學習。所以今天就將上次的”?秒防刷新”進行了一番修改。上次是采用註

    interceptor攔截

    ase patch response del ppi pack 設置 and bject fifter、servlet、interceptor fifter用來處理請求頭、請求參數、編碼的一些設置,然後轉交給servlet,處理業務,返回 servlet現在常用

    Anguar 使用interceptor攔截設定請求頭傳入jwt token

    1.建立http-interceptors.ts檔案 import { Injectable } from "@angular/core"; import { HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse

    springMVC學習 十二 攔截

    一 攔截器概述   攔截器技術比較像java web技術中的過濾器技術,都是傳送 請求時被攔截器攔截,在控制器的前後新增額外功能。但是和Spring中的Aop技術是由區別的。AOP 在特定方法前後擴充(一般是對 ServiceImpl的方法進行擴充),而攔截器是對控制器的請求進行攔截。   但是攔截器和j

    SpringMVC(攔截

    SpringMVC(七)攔截器 當請求來到DispatcherServlet時,它會根據HandlerMapping的機制找到處理器,這樣就返回一個HandlerExecutionChain物件,這個物件包含處理器和攔截器。這裡的攔截器會對處理器進行攔截,這樣通過攔截器就可以增強處理

    SpringMVC Interceptor攔截

    今天偶爾看見的,以前還沒見過,就瞭解下 該攔截器主要是:在進Controller之前,                  

    五十、Filter過濾器,Interceptor攔截,ControllerAdvice,Aspect切片

    Filter過濾器,Interceptor攔截器,ControllerAdvice,Aspect切片 上圖為在web專案中,在處理request請求時得處理順序 在專案中我們改怎麼使用呢?  Filter過濾器 /** * Created by GAOMINGQIA

    Springboot之如何使用interceptor攔截

    在這裡我就不細說它的原理什麼的了,具體原理看這個Filter和攔截器的區別 https://blog.csdn.net/kxj19980524/article/details/85316586 SpringBoot使用步驟 先建立一個interceptor實現HandlerInterce

    springboot實現自定義的Interceptor攔截

    構建springboot專案 這裡使用的是eclipse,簡單化 其他實體之類的程式碼省略 專案程式碼 application.properties # 資料來源配置 sp

    OkHttp 3.x 原始碼解析之Interceptor 攔截

    OkHttp攔截器原理解析 攔截器 Java裡的攔截器是動態攔截Action呼叫的物件。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的程式碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中

    SpringMVC之interceptor攔截

    Interceptor攔截器 一、概念 攔截器是SpringMVC中的一個強大控制元件,它可以在進入處理器之前做一些操作,或者在處理器完成後進行操作,甚至是在渲染檢視後進行操作。 二、攔截器定義       Spring要求處理器的攔截器都要實現org.springfram

    Spring Interceptor攔截

    轉自:https://blog.csdn.net/qq_35246620/article/details/68487904 1. 攔截器 1.1 概念   Java 裡的攔截器是動態攔截 action 呼叫的物件。它提供了一種機制可以使開發者可以定義在一個 action 執行的前後執

    解決 Springboot中Interceptor攔截中依賴注入失敗

    BeanFactory beanFactory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext()); userService = (UserService) bea

    OkHttp攔截請求與相應,以及控制檯列印日誌(Interceptor攔截

    OkHttp攔截請求與相應,以及控制檯列印日誌(Interceptor攔截器) 本文將簡單介紹OkHttp攔截器的使用,具體環境是這樣:伺服器有一個介面,在不同環境下,返回的資料和格式不同,你還想獲取這兩種不同的資料,那麼我想到了用攔截器。 攔截器的作用是什麼,舉一個例子,小明在

    springboot web跨域訪問問題解決--Interceptor攔截方式

    跨域訪問時很多需求,所以springboot的跨域解決也是【必須的】 攔截器方式 //自定義攔截器 import org.springframework.web.servlet.HandlerInt

    springMVC中Interceptor攔截的使用

        @RequestMapping("/checkAdmin.do")     public void checkAdmin(Admin admin,HttpSession session,HttpServletRequest request,HttpServletResponse response)

    OkHttp中Interceptor攔截之公共引數請求封裝

    前言 之前在面試的時候遇到這樣的一個問題,那就是如果app中所有的請求都要加入一些引數(例如 版本號、手機號、登入使用者名稱、token等。。。)那麼怎麼做才能實現,而不至於在每次請求的時候都去進行新增這些請求頭。其實這個問題,剛開始我是拒絕的(之前沒有遇到過