整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Java三大器之?dāng)r截器(Interceptor)的實(shí)現(xiàn)原理及代碼示例

          前言:前面2篇博客,我們分析了Java中過(guò)濾器和監(jiān)聽器的實(shí)現(xiàn)原理,今天我們來(lái)看看攔截器

          1,攔截器的概念

          java里的攔截器是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象,它提供了一種機(jī)制可以使開發(fā)者在一個(gè)Action執(zhí)行的前后執(zhí)行一段代碼,也可以在一個(gè)Action

          執(zhí)行前阻止其執(zhí)行,同時(shí)也提供了一種可以提取Action中可重用部分代碼的方式。在AOP中,攔截器用于在某個(gè)方法或者字段被訪問(wèn)之前,進(jìn)行攔截

          然后再之前或者之后加入某些操作。目前,我們需要掌握的主要是Spring的攔截器,Struts2的攔截器不用深究,知道即可。

          2,攔截器的原理

          大部分時(shí)候,攔截器方法都是通過(guò)代理的方式來(lái)調(diào)用的。Struts2的攔截器實(shí)現(xiàn)相對(duì)簡(jiǎn)單。當(dāng)請(qǐng)求到達(dá)Struts2的時(shí),Struts2

          會(huì)查找配置文件,并根據(jù)配置實(shí)例化相對(duì)的攔截器對(duì)象,然后串成一個(gè)列表(List),最后一個(gè)一個(gè)的調(diào)用列表中的攔截器。Struts2的攔截器是可

          插拔的,攔截器是AOP的一個(gè)實(shí)現(xiàn)。Struts2攔截器棧就是將攔截器按一定的順序連接成一條鏈。在訪問(wèn)被攔截的方法或者字段時(shí),Struts2攔截器鏈

          中的攔截器就會(huì)按照之前定義的順序進(jìn)行調(diào)用。

          3,自定義攔截器的步驟

          第一步:自定義一個(gè)實(shí)現(xiàn)了接口的類,或者繼承抽象類。

          第二步:在配置文件中注冊(cè)定義的攔截器。

          第三步:在需要使用Action中引用上述定義的攔截器,為了方便也可以將攔截器定義為默認(rèn)的攔截器,這樣在不加特殊說(shuō)明的情況下,所有的

          Action都被這個(gè)攔截器攔截。

          4,過(guò)濾器與攔截器的區(qū)別

          過(guò)濾器可以簡(jiǎn)單的理解為“取你所想取”,過(guò)濾器關(guān)注的是web請(qǐng)求;攔截器可以簡(jiǎn)單的理解為“拒你所想拒”,攔截器關(guān)注的是方法調(diào)用,比如攔截

          敏感詞匯。

          4.1,攔截器是基于java反射機(jī)制來(lái)實(shí)現(xiàn)的,而過(guò)濾器是基于函數(shù)回調(diào)來(lái)實(shí)現(xiàn)的。(有人說(shuō),攔截器是基于動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)的)

          4.2,攔截器不依賴servlet容器,過(guò)濾器依賴于servlet容器。

          4.3,攔截器只對(duì)Action起作用,過(guò)濾器可以對(duì)所有請(qǐng)求起作用。

          4.4,攔截器可以訪問(wèn)Action上下文和值棧中的對(duì)象,過(guò)濾器不能。

          4.5,在Action的生命周期中,攔截器可以多次調(diào)用,而過(guò)濾器只能在容器初始化時(shí)調(diào)用一次。

          5,Spring攔截器

          5.1,抽象類apter

          我們?nèi)绻陧?xiàng)目中使用了Spring框架,那么,我們可以直接繼承apter.java這個(gè)抽象類,來(lái)實(shí)現(xiàn)我們自己的攔截器。

          Spring框架,對(duì)java的攔截器概念進(jìn)行了包裝,這一點(diǎn)和Struts2很類似。apter繼承了抽象接口。

          package org..web.servlet.handler;

          import javax.servlet.http.;

          import javax.servlet.http.;

          import org..web.servlet.;

          import org..web.servlet.;

          public class apter {

          // 在業(yè)務(wù)處理器處理請(qǐng)求之前被調(diào)用

          public boolean ( request, , Object handler) throws {

          return true;

          // 在業(yè)務(wù)處理器處理請(qǐng)求完成之后,生成視圖之前執(zhí)行

          public void ( request, , Object handler, )

          throws {

          // 在完全處理完請(qǐng)求之后被調(diào)用,可用于清理資源

          public void ( request, , Object handler, ex)

          throws {

          接下來(lái)我們看一下Spring框架實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的攔截器,繼承了

          使用過(guò)濾器實(shí)現(xiàn)用戶登錄控制_java 過(guò)濾器實(shí)現(xiàn)登錄_登錄過(guò)濾器怎么寫

          抽象類apter,實(shí)現(xiàn)了用戶登錄認(rèn)證的攔截功能,如果當(dāng)前用戶沒(méi)有通過(guò)認(rèn)證,會(huì)報(bào)403錯(cuò)誤。

          package org..web.servlet.handler;

          import java.io.;

          import javax.servlet.;

          import javax.servlet.http.;

          import javax.servlet.http.;

          public class extends apter{

          // 字符串?dāng)?shù)組,用來(lái)存放用戶角色信息

          private String[] ;

          public final void (String[] ){

          this. = ;

          public final boolean ( request, , Object handler)

          throws , {

          if (this. != null) {

          for (int i = 0; i < this..length; ++i) {

          if (request.(this.[i])) {

          return true;

          (request, , handler);

          return false;

          void ( request, , Object handler)

          throws , {

          // 403表示資源不可用。服務(wù)器理解用戶的請(qǐng)求,但是拒絕處理它,通常是由于權(quán)限的問(wèn)題

          .(403);

          下面,我們利用Spring框架提供的apter抽過(guò)類,來(lái)實(shí)現(xiàn)一個(gè)自定義的攔截器。我們這個(gè)攔截器叫做

          ,進(jìn)行登錄攔截控制。工作流程是這樣的:如果當(dāng)前用戶沒(méi)有登錄,則跳轉(zhuǎn)到登錄頁(yè)面;登錄成功后,跳轉(zhuǎn)到

          之前訪問(wèn)的URL頁(yè)面。

          import java.util.HashMap;

          import java.util.Map;

          import javax.servlet.http.;

          import javax.servlet.http.;

          import org..web.servlet.;

          import org..web.servlet.handler.apter;

          /**

          * @ 利用spring框架提供的apter,實(shí)現(xiàn)自定義攔截器

          */

          public class extends apter{

          // 在業(yè)務(wù)處理器處理請(qǐng)求之前被調(diào)用

          public boolean ( request, , Object handler) throws {

          // 與 equals的區(qū)別?

          if("GET".(request.())){

          //.();

          System.out.println("...");

          String = request.();

          String = request.();

          登錄過(guò)濾器怎么寫_使用過(guò)濾器實(shí)現(xiàn)用戶登錄控制_java 過(guò)濾器實(shí)現(xiàn)登錄

          String url = .(.length());

          System.out.println("" + );

          System.out.println("" + );

          System.out.println("url" + url);

          String = (String) request.().("");

          if(null == ){

          // 跳轉(zhuǎn)到登錄頁(yè)面

          request.("/WEB-INF/login.jsp").forward(request, );

          return false;

          else{

          return true;

          // 在業(yè)務(wù)處理器處理請(qǐng)求完成之后,生成視圖之前執(zhí)行

          public void ( request, , Object handler, ) throws {

          System.out.println("...");

          if( != null){

          Map map = new HashMap();

          .(map);

          // 在完全處理完請(qǐng)求之后被調(diào)用,可用于清理資源

          public void ( request, , Object handler, ex) throws {

          System.out.println("...");

          攔截器是依賴Java反射機(jī)制來(lái)實(shí)現(xiàn)的。攔截器的實(shí)現(xiàn),用到的是JDK實(shí)現(xiàn)的動(dòng)態(tài)代理,我們都知道,JDK實(shí)現(xiàn)的動(dòng)態(tài)代理,需要依賴接口。攔截器

          是在面向切面編程中應(yīng)用的,就是在你的service或者一個(gè)方法前調(diào)用一個(gè)方法,或者在方法后調(diào)用一個(gè)方法。攔截器不是在web.xml,比如struts在

          struts.xml中配置。

          public Object invoke(Object proxy, Method method, Object[] args) throws {

          Object result = null;

          System.out.println("方法調(diào)用前,可以執(zhí)行一段代碼" + method.getName());

          result = method.invoke(this., args);

          System.out.println("方法調(diào)用后,可以執(zhí)行一段代碼 " + method.getName());

          return result;

          總結(jié):

          1.過(guò)濾器(Filter):所謂過(guò)濾器顧名思義是用來(lái)過(guò)濾的,Java的過(guò)濾器能夠?yàn)槲覀兲峁┫到y(tǒng)級(jí)別的過(guò)濾,也就是說(shuō),能過(guò)濾所有的web請(qǐng)求,

          這一點(diǎn),是攔截器無(wú)法做到的。在Java Web中,你傳入的request,提前過(guò)濾掉一些信息,或者提前設(shè)置一些參數(shù),然后再傳入servlet或

          者struts的action進(jìn)行業(yè)務(wù)邏輯,比如過(guò)濾掉非法url(不是login.do的地址請(qǐng)求,如果用戶沒(méi)有登陸都過(guò)濾掉),或者在傳入servlet或者struts

          的action前統(tǒng)一設(shè)置字符集,或者去除掉一些非法字符(聊天室經(jīng)常用到的,一些罵人的話)。filter 流程是線性的,url傳來(lái)之后,檢查之后,

          可保持原來(lái)的流程繼續(xù)向下執(zhí)行,被下一個(gè)filter, servlet接收。

          2.監(jiān)聽器():Java的監(jiān)聽器,也是系統(tǒng)級(jí)別的監(jiān)聽。監(jiān)聽器隨web應(yīng)用的啟動(dòng)而啟動(dòng)。Java的監(jiān)聽器在c/s模式里面經(jīng)常用到,它

          會(huì)對(duì)特定的事件產(chǎn)生產(chǎn)生一個(gè)處理。監(jiān)聽在很多模式下用到,比如說(shuō)觀察者模式,就是一個(gè)使用監(jiān)聽器來(lái)實(shí)現(xiàn)的,在比如統(tǒng)計(jì)網(wǎng)站的在線人數(shù)。

          又比如struts2可以用監(jiān)聽來(lái)啟動(dòng)。Servlet監(jiān)聽器用于監(jiān)聽一些重要事件的發(fā)生,監(jiān)聽器對(duì)象可以在事情發(fā)生前、發(fā)生后可以做一些必要的處理。

          3.攔截器():java里的攔截器提供的是非系統(tǒng)級(jí)別的攔截,也就是說(shuō),就覆蓋面來(lái)說(shuō),攔截器不如過(guò)濾器強(qiáng)大,但是更有針對(duì)性。

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

          攔截器是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象,它提供了一種機(jī)制可以使開發(fā)者在一個(gè)Action執(zhí)行的前后執(zhí)行一段代碼,也可以在一個(gè)Action執(zhí)行前阻止其

          執(zhí)行,同時(shí)也提供了一種可以提取Action中可重用部分代碼的方式。在AOP中,攔截器用于在某個(gè)方法或者字段被訪問(wèn)之前,進(jìn)行攔截然后再之前或

          者之后加入某些操作。java的攔截器主要是用在插件上,擴(kuò)展件上比如 Spring Struts2等,有點(diǎn)類似面向切片的技術(shù),在用之前先要在

          配置文件即xml,文件里聲明一段的那個(gè)東西。


          主站蜘蛛池模板: 好吊妞视频一区二区| 一区二区三区高清在线| 国产视频福利一区| 麻豆亚洲av熟女国产一区二| 国产精品一区二区三区久久 | 亚洲av色香蕉一区二区三区| 日韩在线视频一区| 中文字幕乱码亚洲精品一区 | 亚洲av日韩综合一区久热| 无码人妻一区二区三区在线视频| 国产精品 一区 在线| 欧洲精品码一区二区三区免费看 | 国产精品免费一区二区三区四区| 一区二区免费电影| 日韩精品无码人妻一区二区三区| 好吊妞视频一区二区| 无码人妻aⅴ一区二区三区有奶水| 亚洲av无码一区二区三区观看| 久久中文字幕一区二区| 日韩精品无码一区二区三区四区| 国产亚洲综合一区二区三区| 精品日韩一区二区| 国产suv精品一区二区6| 精品视频一区二区观看| 日韩精品午夜视频一区二区三区| 日本一区频道在线视频| 国内精品一区二区三区最新| 国产成人AV区一区二区三 | 久久se精品一区精品二区| 亚洲一区二区视频在线观看| 成人免费av一区二区三区| 91福利国产在线观看一区二区| 国产在线精品一区免费香蕉| 精品视频一区二区三区免费| 色偷偷久久一区二区三区| 亚洲无码一区二区三区| 无码欧精品亚洲日韩一区夜夜嗨| 久久精品一区二区影院| 亚洲AV成人一区二区三区AV| 国产自产对白一区| 一区二区三区91|