<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-15  評論-79  文章-0  trackbacks-0

    最近發現很多朋友連攔截器都不知道,于是想寫個BLOG總結一下。
    java攔截器的基本原理其實非常簡單,說白了就是動態代理類。
    下面來看一個簡單的例子
    首先,我建立一個攔截器的類InterceptorClass,這里的before()和after()方法是以后攔截器會執行的方法
    CODE清單一:

    public class InterceptorClass {
     
    public void before()
      System.out.println(
    "攔截器InterceptorClass方法調用:before()!"); 
     }
     
     
    public void after()
         System.out.println(
    "攔截器InterceptorClass方法調用:after()!"); 
     }

    }

     

    我們模擬一個業務組件接口BusinessInterface,和一個業務組件實現類BusinessClass
    CODE清單二:

    public interface BusinessInterface {
     
    public void doSomething();
    }

     

    CODE清單三:

    public class BusinessClass implements BusinessInterface {
     
    public void doSomething() {
       System.out.println(
    "業務組件BusinessClass方法調用:doSomething()"); 
     }

    }

     

    然后,創建一個動態代理類DynamicProxyHandler,這個類是集成InvocationHandler接口的,動態類的原理實際上是使得當你執行一個動態方

    法的時候,他可以把這個動態方法dispatch到這個動態類上來。這樣,你就可以在這個方法的前后嵌入自己的一些方法。
    CODE清單四:
    //包含了業務對象綁定動態代理類的處理,并實現了InvocationHandler接口的invoke方法

    public class DynamicProxyHandler implements InvocationHandler {
     
    private Object business;//被代理對象
     private InterceptorClass inceptor = new InterceptorClass();//攔截器
     
     
    // 動態生成一個代理類對象,并綁定被代理類和代理處理器
     public Object bind(Object business) {
       
    this.business = business;
       
    return Proxy.newProxyInstance(
         
    //被代理類的ClassLoader
         business.getClass().getClassLoader(),
         
    //要被代理的接口,本方法返回對象會自動聲稱實現了這些接口
         business.getClass().getInterfaces(), 
         
    //代理處理器對象
         this);
     }


     
     // 代理要調用的方法,并在方法調用前后調用連接器的方法

     /**
      * 
    @param proxy  代理類對象
      * 
    @param method 被代理的接口方法
      * 
    @param args   被代理接口方法的參數
      * 
    @throws Throwable
      
    */

     
    public Object invoke(Object proxy, Method method, Object[] args)
       
    throws Throwable {
      Object result 
    = null;
      inceptor.before();
      result
    =method.invoke(business,args);
      inceptor.after();
      
    return result;
     }


    OK,我們來寫個類測試一下
    CODE清單五:

    public static void main(String[] args) {
      
    //生成動態代理類實例
      DynamicProxyHandler handler = new DynamicProxyHandler();
      
    //生成待測試的業務組件對象
            BusinessInterface business = new BusinessClass();
            
    //將業務組件對象和動態代理類實例綁定
            BusinessInterface businessProxy = (BusinessInterface) handler.bind(business);
            
    //用動態代理類調用方法
            businessProxy.doSomething();
     }


    來看看結果:


    近期struts2很流行,而且攔截器是struts2里面一個比較好的功能,下面舉個例子說明一下攔截器在struts2中的用法。
    struts2對攔截器實現做了一個封裝,使得我們在實現的時候比較簡單。
    首先我們要建一個攔截器類
    CODE清單六:

    public class AuthorizationInterceptor extends AbstractInterceptor {
     @Override
     
    public String intercept(ActionInvocation invocation) throws Exception {
      Map session 
    = invocation.getInvocationContext().getSession();
      String userName 
    = (String) session.get("userName");
      
    if ( userName != null && userName.equals("test")) {
       System.out.println(
    "攔截器:合法用戶登錄---");
       
    return invocation.invoke();
      }

      
    else
      
    {
       System.out.println(
    "攔截器:用戶未登錄---");
       
    return Action.LOGIN;
      }

     }

    }


    這個類是必須要繼承struts2包中提供的AbstractInterceptor類,這個類有一個抽象方法intercept,這個方法是必須要實現的。
    那么經理在這個攔截器里面寫了一個簡單的實現,對url用戶合法性做了一個限制。

    接下來比較關鍵的是過濾器在struts2中的配置,先看看代碼
    CODE清單七:

    <package name="system" extends="struts-default">
      
    <interceptors>
       
    <!--  定義權限控制攔截器  -->
       
    <interceptor name="authority" 

    class
    ="com.sharesin.biz.common.intercepts.struts2.AuthorizationInterceptor"/>
       
    <!-- 定義一個包含權限控制的攔截器棧   -->
       
    <interceptor-stack name="mystack">
        
    <interceptor-ref name="defaultStack"></interceptor-ref>
        
    <interceptor-ref name="authority"></interceptor-ref>
       
    </interceptor-stack>
      
    </interceptors>
       
    <!--定義默認攔截器   -->
            
    <default-interceptor-ref name="mystack" />
       
    <!--定義全局處理結果   -->
      
    <global-results>
       
    <result name="login">index.jsp</result>
      
    </global-results>
      
    <action name="login_*" class="com.sharesin.biz.web.system.LoginAction" method="{1}">
       
    <result name="success">system/homepage.jsp</result>
      
    </action>
     
    </package>


    在interceptors節點里,我們可以定義多個攔截器,這里的名為authority的只是其中的一個。struts2的攔截器棧我是先執行struts2默認的攔

    截器defaultStack,然后再執行我的。然后只需要用default-interceptor-ref標簽設置好這個system包中的默認攔截器為這個攔截器就OK了。

    struts2中引入了package這個概念,我覺得十分實用,當然這對struts2攔截器也是個實惠,我們可以根據不同的action來分包和不同的攔截器


    ok,來運行測試一下。


    結果..


     

     

     

     

     

    posted on 2010-09-06 17:21 張元Won 閱讀(4513) 評論(3)  編輯  收藏 所屬分類: Java

    評論:
    # re: JAVA攔截器原理及Struts2擴展 2011-05-16 13:46 | lixiujuan
    以上代碼中struts的運行還是在測試類里運行吧?怎么執行不了啊,,,???  回復  更多評論
      
    # re: JAVA攔截器原理及Struts2擴展 2011-05-27 08:54 | え經理え
    確實在測試類里的,不過絕對運行的了的..不然不會截圖...你報的什么錯?..@lixiujuan
      回復  更多評論
      
    # re: JAVA攔截器原理及Struts2擴展 2014-08-04 00:15 | 打破沙鍋問到底
    攔截器一直攔截 根本過不去啊 一直在登錄頁面 不管你怎么填
    Map session = invocation.getInvocationContext().getSession();
    String userName = (String) session.get("userName");

    這個userName 就是null值啊 另外這個get里的“userName” 隨意給的嗎  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费一级特黄特色大片在线| 久久精品国产亚洲沈樵| 午夜在线免费视频| 亚洲伊人tv综合网色| 日韩一区二区三区免费体验| a级毛片100部免费观看| 亚洲人成电影网站色www| 91麻豆国产自产在线观看亚洲| 国产在线观看麻豆91精品免费| 女bbbbxxxx另类亚洲| 亚洲国产成人久久精品影视| 四虎影视永久免费视频观看| 91香焦国产线观看看免费| 免费毛片毛片网址| 在线综合亚洲中文精品| 亚洲AV无码日韩AV无码导航| 免费大香伊蕉在人线国产| 亚洲黄色免费网站| aa在线免费观看| 久久无码av亚洲精品色午夜 | 亚洲人成www在线播放| 国产亚洲精午夜久久久久久| 成人午夜视频免费| 中国xxxxx高清免费看视频| 在线播放免费人成视频网站| 中文字幕乱码亚洲无线三区| 亚洲视频在线观看免费| 国产亚洲精品无码专区| 国产99视频精品免费视频7| 91免费精品国自产拍在线不卡| baoyu122.永久免费视频| 特级毛片全部免费播放a一级| 中国亚洲呦女专区| 亚洲明星合成图综合区在线| 亚洲成AV人片在线观看无码 | 青草草在线视频永久免费| 免费A级毛片av无码| A级毛片成人网站免费看| 深夜a级毛片免费无码| 亚洲Av永久无码精品黑人| 最新亚洲精品国偷自产在线|