最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java web攔截器inteceptor原理及應(yīng)用詳解

 更新時間:2020年01月06日 14:32:54   作者:天際星痕  
這篇文章主要介紹了java web攔截器inteceptor原理及應(yīng)用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

這篇文章主要介紹了java web攔截器inteceptor原理及應(yīng)用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

一、簡介

java里的攔截器提供的是非系統(tǒng)級別的攔截,也就是說,就覆蓋面來說,攔截器不如過濾器強大,但是更有針對性。

Java中的攔截器是基于Java反射機制實現(xiàn)的,更準(zhǔn)確的劃分,應(yīng)該是基于JDK實現(xiàn)的動態(tài)代理。它依賴于具體的接口,在運行期間動態(tài)生成字節(jié)碼。

攔截器是動態(tài)攔截Action調(diào)用的對象,它提供了一種機制可以使開發(fā)者在一個Action執(zhí)行的前后執(zhí)行一段代碼,也可以在一個Action執(zhí)行前阻止其執(zhí)行,同時也提供了一種可以提取Action中可重用部分代碼的方式。在AOP中,攔截器用于在某個方法或者字段被訪問之前,進行攔截然后再之前或者之后加入某些操作。java的攔截器主要是用在插件上,擴展件上比如 Hibernate Spring Struts2等,有點類似面向切片的技術(shù),在用之前先要在配置文件即xml,文件里聲明一段的那個東西。

SpringMVC 中的Interceptor 攔截器的主要作用就是攔截用戶的 url 請求,并在執(zhí)行 handler 方法的前中后加入某些特殊請求,類似于 servlet 里面的過濾器.

SpringMVC 中的Interceptor 攔截器也是相當(dāng)重要和相當(dāng)有用的,它的主要作用是攔截用戶的請求并進行相應(yīng)的處理。比如通過它來進行權(quán)限驗證,或者是來判斷用戶是否登陸,或者是像12306 那樣子判斷當(dāng)前時間是否是購票時間。

二、應(yīng)用場景

1、日志記錄,可以記錄請求信息的日志,以便進行信息監(jiān)控、信息統(tǒng)計等。

2、權(quán)限檢查:如登陸檢測,進入處理器檢測是否登陸,如果沒有直接返回到登陸頁面。

3、性能監(jiān)控:典型的是慢日志。

三、實現(xiàn)

3.1 實現(xiàn)方式

SpringMVC 中的Interceptor 攔截請求是通過HandlerInterceptor 來實現(xiàn)的。在SpringMVC 中定義一個Interceptor 非常簡單,主要有兩種方式,

方式一:

定義的Interceptor類要實現(xiàn)了Spring 的HandlerInterceptor 接口,或者是這個類繼承實現(xiàn)了HandlerInterceptor 接口的類,比如Spring 已經(jīng)提供的實現(xiàn)了HandlerInterceptor 接口的抽象類HandlerInterceptorAdapter ;

方式二:

實現(xiàn)Spring的WebRequestInterceptor接口,或者是繼承實現(xiàn)了WebRequestInterceptor的類。

實現(xiàn)HandlerInterceptor接口詳細(xì)說明:

HandlerInterceptor 接口中定義了三個方法,我們就是通過這三個方法來對用戶的請求進行攔截處理的。

(1 )preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,顧名思義,該方法將在請求處理之前進行調(diào)用。SpringMVC 中的Interceptor 是鏈?zhǔn)降恼{(diào)用的,在一個應(yīng)用中或者說是在一個請求中可以同時存在多個Interceptor 。每個Interceptor 的調(diào)用會依據(jù)它的聲明順序依次執(zhí)行,而且最先執(zhí)行的都是Interceptor 中的preHandle 方法,所以可以在這個方法中進行一些前置初始化操作或者是對當(dāng)前請求的一個預(yù)處理,也可以在這個方法中進行一些判斷來決定請求是否要繼續(xù)進行下去。該方法的返回值是布爾值Boolean 類型的,當(dāng)它返回為false 時,表示請求結(jié)束,后續(xù)的Interceptor 和Controller 都不會再執(zhí)行;當(dāng)返回值為true 時就會繼續(xù)調(diào)用下一個Interceptor 的preHandle 方法,如果已經(jīng)是最后一個Interceptor 的時候就會是調(diào)用當(dāng)前請求的Controller 方法。

(2 )postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法,由preHandle 方法的解釋我們知道這個方法包括后面要說到的afterCompletion 方法都只能是在當(dāng)前所屬的Interceptor 的preHandle 方法的返回值為true 時才能被調(diào)用。postHandle 方法,顧名思義就是在當(dāng)前請求進行處理之后,也就是Controller 方法調(diào)用之后執(zhí)行,但是它會在DispatcherServlet 進行視圖返回渲染之前被調(diào)用,所以我們可以在這個方法中對Controller 處理之后的ModelAndView 對象進行操作。postHandle 方法被調(diào)用的方向跟preHandle 是相反的,也就是說先聲明的Interceptor 的postHandle 方法反而會后執(zhí)行,這和Struts2 里面的Interceptor 的執(zhí)行過程有點類型。Struts2 里面的Interceptor 的執(zhí)行過程也是鏈?zhǔn)降模皇窃赟truts2 里面需要手動調(diào)用ActionInvocation 的invoke 方法來觸發(fā)對下一個Interceptor 或者是Action 的調(diào)用,然后每一個Interceptor 中在invoke 方法調(diào)用之前的內(nèi)容都是按照聲明順序執(zhí)行的,而invoke 方法之后的內(nèi)容就是反向的。

(3 )afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法,該方法也是需要當(dāng)前對應(yīng)的Interceptor 的preHandle 方法的返回值為true 時才會執(zhí)行。顧名思義,該方法將在整個請求結(jié)束之后,也就是在DispatcherServlet 渲染了對應(yīng)的視圖之后執(zhí)行。這個方法的主要作用是用于進行資源清理工作的。

3.2 實現(xiàn)示例

直接上代碼:

3.2.1 自定義攔截器類

package com.my.dm.interceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
public class TestInterceptor implements HandlerInterceptor {
 
  private Logger logger =LogManager.getLogger(TestInterceptor.class);
              
 @Override
 public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
   throws Exception {
  // TODO Auto-generated method stub
  logger.error("afterCompletion");
 }
 
 @Override
 public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
   throws Exception {
  // TODO Auto-generated method stub
  logger.error("postHandle");
 }
 
 @Override
 public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
  // TODO Auto-generated method stub
  logger.error("preHandle");
  return true;
 }
 
}

3.2.2 對應(yīng)單個攔截器配置

<!-- 配置攔截器 -->
 <mvc:interceptors>
  <mvc:interceptor>
   <mvc:mapping path="/**" />
   <bean class="com.my.dm.interceptor.TestInterceptor"></bean>
  </mvc:interceptor>
 </mvc:interceptors>

3.2.3 對多個攔截器配置

<mvc:interceptors>
  <mvc:interceptor>
   <mvc:mapping path="/employee/**" />
   <mvc:mapping path="/trainning/**" />
   <mvc:mapping path="/manage/**" />
   <mvc:exclude-mapping path="/**/fonts/*" />
   <mvc:exclude-mapping path="/**/*.css" />
   <mvc:exclude-mapping path="/**/*.js" />
   <mvc:exclude-mapping path="/**/*.png" />
   <mvc:exclude-mapping path="/**/*.gif" />
   <mvc:exclude-mapping path="/**/*.jpg" />
   <mvc:exclude-mapping path="/**/*.jpeg" />
   <bean class="com.pmo.interceptor.PageInterceptor" />
  </mvc:interceptor>
  <mvc:interceptor> 
    <mvc:mapping path="/**"/>
    <bean class="com.pmo.interceptor.LoginInterceptor"></bean> 
  </mvc:interceptor>
  <mvc:interceptor> 
    <mvc:mapping path="/**"/>
    <bean class="com.pmo.interceptor.UserAuthorityInterceptor"></bean> 
  </mvc:interceptor>
 </mvc:interceptors>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java抓取網(wǎng)頁或文件中的郵箱號碼

    java抓取網(wǎng)頁或文件中的郵箱號碼

    這篇文章主要為大家詳細(xì)介紹了java如何抓取網(wǎng)頁或文件中的郵箱號碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 如何使用 IntelliJ IDEA 編寫 Spark 應(yīng)用程序(Scala + Maven)

    如何使用 IntelliJ IDEA 編寫 Spark 應(yīng)用程序(Sc

    本教程展示了如何在IntelliJIDEA中使用Maven編寫和運行一個簡單的Spark應(yīng)用程序(例如WordCount程序),本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • SpringMVC接收多個對象的4種方法

    SpringMVC接收多個對象的4種方法

    這篇文章主要為大家詳細(xì)介紹了SpringMVC接收多個對象的4種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Spring 使用注解方式進行事務(wù)管理配置方式

    Spring 使用注解方式進行事務(wù)管理配置方式

    本篇文章主要介紹了Spring 使用注解方式進行事務(wù)管理配置方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java精確計算BigDecimal類詳解

    Java精確計算BigDecimal類詳解

    這篇文章主要介紹了Java精確計算BigDecimal類的使用方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • springBoot無法解析yml問題

    springBoot無法解析yml問題

    這篇文章主要介紹了springBoot無法解析yml問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Mybatis-Plus中update()和updateById()將字段更新為null

    Mybatis-Plus中update()和updateById()將字段更新為null

    本文主要介紹了Mybatis-Plus中update()和updateById()將字段更新為null,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java中List集合及其實現(xiàn)類的方法詳解

    java中List集合及其實現(xiàn)類的方法詳解

    本篇文章給大家?guī)淼膬?nèi)容是關(guān)于java中List集合及其實現(xiàn)類的方法介紹(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。下面我們就來學(xué)習(xí)一下吧
    2019-06-06
  • java如何循環(huán)增加序號

    java如何循環(huán)增加序號

    這篇文章主要介紹了java如何循環(huán)增加序號問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • 圖文詳解Java中的字節(jié)輸入與輸出流

    圖文詳解Java中的字節(jié)輸入與輸出流

    在Java中所有數(shù)據(jù)都是使用流讀寫的,流是一組有序的數(shù)據(jù)序列,將數(shù)據(jù)從一個地方帶到另一個地方,這篇文章主要給大家介紹了關(guān)于Java中字節(jié)輸入與輸出流的相關(guān)資料,需要的朋友可以參考下
    2021-08-08

最新評論

天津市| 平安县| 平谷区| 八宿县| 镇江市| 平山县| 穆棱市| 当涂县| 平昌县| 莱阳市| 喀喇沁旗| 吉林省| 家居| 芜湖县| 肥西县| 专栏| 荔浦县| 台江县| 丹凤县| 凤翔县| 三门峡市| 正阳县| 收藏| 原阳县| 获嘉县| 黄大仙区| 同仁县| 湖州市| 卢龙县| 大埔区| 武定县| 英德市| 常宁市| 林甸县| 汾阳市| 永清县| 永寿县| 塘沽区| 喀喇沁旗| 烟台市| 高清|