Java中inteceptor攔截器的原理是什么

本篇文章為大家展示了Java中inteceptor攔截器的原理是什么,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:空間域名、雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、寧都網(wǎng)站維護(hù)、網(wǎng)站推廣。

一、簡介

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

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

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

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

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

二、應(yīng)用場景

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

2、權(quán)限檢查:如登陸檢測,進(jì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 接口中定義了三個方法,我們就是通過這三個方法來對用戶的請求進(jìn)行攔截處理的。

(1 )preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,顧名思義,該方法將在請求處理之前進(jìn)行調(diào)用。SpringMVC 中的Interceptor 是鏈?zhǔn)降恼{(diào)用的,在一個應(yīng)用中或者說是在一個請求中可以同時存在多個Interceptor 。每個Interceptor 的調(diào)用會依據(jù)它的聲明順序依次執(zhí)行,而且最先執(zhí)行的都是Interceptor 中的preHandle 方法,所以可以在這個方法中進(jìn)行一些前置初始化操作或者是對當(dāng)前請求的一個預(yù)處理,也可以在這個方法中進(jìn)行一些判斷來決定請求是否要繼續(xù)進(jìn)行下去。該方法的返回值是布爾值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)前請求進(jìn)行處理之后,也就是Controller 方法調(diào)用之后執(zhí)行,但是它會在DispatcherServlet 進(jìn)行視圖返回渲染之前被調(diào)用,所以我們可以在這個方法中對Controller 處理之后的ModelAndView 對象進(jìn)行操作。postHandle 方法被調(diào)用的方向跟preHandle 是相反的,也就是說先聲明的Interceptor 的postHandle 方法反而會后執(zhí)行,這和Struts2 里面的Interceptor 的執(zhí)行過程有點(diǎn)類型。Struts2 里面的Interceptor 的執(zhí)行過程也是鏈?zhǔn)降?,只是在Struts2 里面需要手動調(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í)行。這個方法的主要作用是用于進(jìn)行資源清理工作的。

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)容就是Java中inteceptor攔截器的原理是什么,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁題目:Java中inteceptor攔截器的原理是什么
URL地址:http://muchs.cn/article6/jpehog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計網(wǎng)站導(dǎo)航、外貿(mào)建站自適應(yīng)網(wǎng)站、電子商務(wù)、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司