999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

NET平臺利用AspectSharp實現(xiàn)權(quán)限驗證

2006-12-31 00:00:00靳小強唐寧九胡雪亮
計算機應(yīng)用研究 2006年8期

(四川大學(xué) 計算機學(xué)院, 四川 成都 610065)

摘 要: 通過對AOP和OOP的簡單分析提出了AOP的發(fā)展前景;介紹DynamicProxy的基本原理和攔截機制以及.NET平臺下AOP實現(xiàn)技術(shù)的研究;最后在此基礎(chǔ)上提出利用AspectSharp實現(xiàn)權(quán)限驗證的思路。

關(guān)鍵詞: 面向方面的編程; Aspect; DynamicProxy

中圖法分類號: TP309 文獻標識碼: A

文章編號: 1001 3695(2006)08 0152 03

.NET Platform Jurisdiction Confirmation Implementation by Aspect

Sharp

JIN Xiao qiang, TANG Ning jiu, HU Xue liang

(College of Computer Science, Sichuan University, Chengdu Sichuan 610065, China)

Abstract: Through analyzing AOP and OOP,then presents the AOP development prospects.This paper introduces the basic principle and intercept mechanism of DynamicProxy and researches the .Net platform implementatation technology of AOP.In this foundation give thought of implementatation jurisdiction confirmation by AspectSharp.

Key words: Aspect Oriented Programming(AOP); Aspect; DynamicProxy

面向方面的編程(Aspect Oriented Programming,AOP)是面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP)的延續(xù),是一種新的編程技術(shù),它彌補了OOP在跨越模塊行為上的不足。因為傳統(tǒng)的程序表現(xiàn)出來的是不能自然地適合單個程序模塊或者幾個緊密相關(guān)的程序模塊的行為,比如日志記錄、性能優(yōu)化以及設(shè)計模式等,我們將這種行為稱為橫切關(guān)注點(Cross Cutting Concern),它跨越了給定編程模型中的典型職責(zé)界限。通過引進Aspect,將影響多個類的行為封裝到一個可重用模塊中,允許程序員對橫切關(guān)注點進行模塊化,用一種松散耦合的方式來實現(xiàn)獨立的關(guān)注點,然后經(jīng)過組合建立最終系統(tǒng),從而消除了OOP引起的代碼混亂和分散問題,增強了系統(tǒng)的可維護性和代碼的重用性。AOP也是GOF設(shè)計模式的延續(xù),設(shè)計模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,所以AOP可以說也是這種目標的一種實現(xiàn)。

1.NET平臺AOP實現(xiàn)技術(shù)研究

目前,在.NET平臺上的AOP實現(xiàn)遠不如Java平臺上的成熟,功能也比較弱,使用上也不是很方便。

1.1實現(xiàn)AOP的方法

實現(xiàn)AOP的關(guān)鍵是攔截正常的方法調(diào)用,將我們需要額外附加的功能(不同方面的代碼)透明地“織入”到這些方法中,以完成一些額外的要求。從總體方法上來說,織入的方法有兩大類:靜態(tài)織入和動態(tài)織入。

1.1.1靜態(tài)織入方法

一般都是需要擴展編譯器的功能,將需要織入的代碼通過修改IL代碼直接添加到相應(yīng)的被織入點;或需要為原來語言添加新的語法結(jié)構(gòu),從語法上支持AOP(AspectJ就是采用的這種方式)。使用這種方式來實現(xiàn)AOP,其優(yōu)點是代碼執(zhí)行的效率高,缺點是實現(xiàn)者需要對.NET Framework有很深的了解才能夠做到對IL的修改。由于織入方法是靜態(tài)的,當需要添加新的織入方法時,往往需要重新編譯,或者運行IL增強器重新執(zhí)行靜態(tài)織入的方法。在.NET平臺上,我們也可以使用Emit提供的強大功能來實現(xiàn)這一點。但是,IL增強器帶來了很大的非透明性,程序員很難直觀地調(diào)試增強后的字節(jié)碼。

1.1.2動態(tài)織入方法

在Java平臺上,可以使用Proxy模式或定制ClassLoader來實現(xiàn)AOP功能。

在.NET平臺上,要實現(xiàn)AOP的動態(tài)織入,歸納起來可以采用以下幾種方法:

(1)使用ContextAttribute和ContextBoundObject來對對象的方法進行攔截。

(2)使用Emit,在運行時動態(tài)構(gòu)建被織入代碼后的類,當程序調(diào)用被織入類時,實際上調(diào)用的是被修改后的類(Loom使用的就是這種方式)。

(3)使用Proxy模式。

在ASP.NET中使用HTTPHandler和HTTPModule來自定義對ASP.NET頁面的訪問加入一些我們需要的處理。

2AspectSharp的工作原理

AspectSharp是一個基于.NET的AOP開源項目,它兼容于AOP Alliance規(guī)范(基于AOP和Java平臺上的一個開源項目,它致力于推動AOP在軟件工程中的應(yīng)用實施和標準化工作,以增強現(xiàn)有的中間件平臺(如J2EE),及開發(fā)環(huán)境(如JBuilder等)在這方面存在的缺陷。目前AOP Alliance已成為面向方面編程的參照標準),基于DynamicProxy和自定義格式的配置文件來為工程項目配置和加載。

AspectSharp充分發(fā)揚了AOP關(guān)于分散關(guān)注、代碼重用、功能拆分的思想。其主要特點表現(xiàn)在:

(1)易用;

(2)自定義配置語言;

(3)通過混入類實現(xiàn)行為的多態(tài);

(4)聯(lián)合切入點與攔截器。

AspectSharp的工作原理如圖1所示。

3DynamicProxy基本原理

通過實際對象(如TestImpl)得到它繼承的接口(ITest)的函數(shù)信息,動態(tài)生成一個新的代理類(可以理解為動態(tài)生成一個繼承自ITest的新類ITestProxy),新的代理類Hook成了被代理類所有的函數(shù)調(diào)用方法,使其所有的函數(shù)調(diào)用最后轉(zhuǎn)到代理類(ITestProxy)的Invoke方法,這樣我們就可以在代理類(ITestProxy)的Invoke中進行類似AOP處理的操作。

我們以用戶權(quán)限檢查為例來看一下DynamicProxy的攔截機制:

//業(yè)務(wù)類接口

Public interface ITest

{

TestFunctionOne( )

}

//業(yè)務(wù)類

Public class ITestImpl

{

Public void TestFunctionone( )

{

}

} 

其函數(shù)調(diào)用流程如下:

得到動態(tài)生成的ITestProxy的一個實例

ITest test=(ITest)SecurityProxy.NewInstance(new TestImpl());

執(zhí)行業(yè)務(wù)類的方法,實際調(diào)用的是SecurityProxy類中的Invoke函數(shù)test.TestFunctionOne();

Invoke函數(shù)會實際調(diào)用ITestImpl的TestFunctionOne()方法,而在調(diào)用此方法以前使用IsMethodInRole(userRole, method.Name)進行用戶權(quán)限的檢查。 

DynamicProxy的主要特點:

(1)通過DynamicProxy可以很方便地實現(xiàn)類似AOP的機制;

(2)由于它是通過得到實際對象的Interface(接口)信息來進行函數(shù)調(diào)用Hook的,所有我們要使用的類都得從Interface繼承;

(3)不能很方便地自定義哪些函數(shù)要Hook,哪些不要。

4實現(xiàn)權(quán)限驗證

在軟件開發(fā)的過程中,常常需要對某些操作進行權(quán)限的驗證工作,即當用戶執(zhí)行某種操作時系統(tǒng)需要對其身份進行驗證,以確認他是否有權(quán)限進行相關(guān)的操作。一種解決方案是:基于每一種需要驗證權(quán)限的操作進行權(quán)限定義,在權(quán)限的基礎(chǔ)上再定義角色。當某個用戶進行某項操作時,系統(tǒng)會根據(jù)用戶當前的角色來判斷該用戶是否被允許執(zhí)行該操作。而驗證用戶身份的代碼常常與實際用戶想要執(zhí)行的代碼混在一起。下面我們應(yīng)用AspectSharp來完成用戶權(quán)限驗證的工作,以實現(xiàn)關(guān)注點的分離。思路如下:

(1)首先定義一個常規(guī)業(yè)務(wù)處理類的接口

Public interface IBusinessOperation

{

void Run( );

} 

(2)實現(xiàn)常規(guī)業(yè)務(wù)處理類

Public class BusinessOperation

{

Public void Run( )

{

Console.WriteLine("My BusinessOperation is running")

}

} 

(3)身份驗證類,利用該類作為攔截器攔截身份驗證

Public interface ISecurity

{

void Validate( );

}

Public ProductSecurityAttribute:Attribute, IBizSecurity 

{

ProductAccess access;

Public ProductSecurityAttribute(ProductAccess access)

{

this.access=access;

}

Public void Validate( )

{

// 驗證用戶是否有權(quán)限操作

}

}

Public class SecurityInterceptor:IMethodInterceptor,ISecurity

{

Public SecurityInterceptor( )

{

}

#region IMethodInterceptor Members

Public object Invoke(IMethod Invocation invocation)

{

bool isPassed=Validate (IMethod Invocation invocation);

if isPassed= =true 

{

return invocation.Proceed( );

}

else

{…}

}

#endregion

Public bool Validate (IMethodInvocation invocation)

{

/*在此驗證用戶是否有權(quán)限操作,從數(shù)據(jù)庫中取得用戶的角色及權(quán)限列表,如果允許該用戶 進行操作則返回True,否則返回False*/

}

} 

(4)Aspect配置

<a spectsharp>

<advices>

<interceptors> 

<interceptor name="Security"

type="MyStudy.SecurityInterceptor, MyStudy"/>

</interceptors>

</advices>

<aspects defaultNamespace="MyStudy">

<aspect typeName="BusinessOperation">

<pointcut method="Run" interceptor="Security"/>

</aspect>

</aspects>

</aspectsharp> 

在業(yè)務(wù)對象BusinessOperation的Run方法上定義截入點, 由SecurityInterceptor進行載入處理。

5結(jié)束語

基于DynamicProxy的實現(xiàn)是設(shè)計模式的發(fā)展,思路也較為精巧(DynamicProxy,AspectSharp都是采用這種思想,但方式又有所不同),通過.NET提供的Reflection.emit等強大工具構(gòu)造一個類似透明代理的封裝,可以解決簡潔性和效率方面的一些問題,但實現(xiàn)方式欠自然。創(chuàng)建對象的時候并不是直接New一個對象,而是需要對其包裝,返回一個類似于透明代理的對象,讓人感覺到Hook的存在,并且對于構(gòu)造函數(shù)的攔截需特殊處理,再就是只能攔截接口方法及虛方法,并且同樣存在對歷史構(gòu)件或第三方構(gòu)件難以復(fù)用的問題。

本文是以近年來興起的一種新的編程思想——Aspect Oriented Programming(AOP,面向方面的編程)為指導(dǎo)思想,結(jié)合Java平臺上AOP的多種實現(xiàn)模式及幾個基于.NET的AOP 開源項目,對.NET平臺上的AOP編程實現(xiàn)作一點探討。雖然現(xiàn)在人們對于AOP的研究還處于相當不完善的階段,它也只能應(yīng)用于很少的幾種語言環(huán)境下,特別是.NET平臺上AOP的實現(xiàn)微軟尚未作出明確的支持,但AOP的出現(xiàn)將會使應(yīng)用程序的開發(fā)更加快速、更靈活,且較少出現(xiàn)缺陷卻是一個不爭的事實。AOP將最終改變整個軟件開發(fā)的方式,它很可能會是編程方法學(xué)發(fā)展的一個里程碑,并且更完美地實現(xiàn)“用例驅(qū)動”的開發(fā)思想。

參考文獻:

[1]Erich Camma, Richard Helm, Ralph Johnson,et al.Design Patterns: Elements of Reusable Object Oriented Software[M].Addison Wesley,2003.

[2] Andrei Popovici,Thomas Gross,Gustavo Alonso.Dynamic Weaving for Aspect Oriented Programming[M].ACM Press,2002.

[3] Alexandre Vasseur.Dynamic AOP and Runtime Weaving for Java:How Does Aspect Werkz Address It in Dynamic AOP[C].Workshop of AOSD,2004.

[4] Ramnivas Laddad.I Want My AOP![J].Java World,2002.

[5] Jonas Boner.AspectWe rkz Dynamic AOP for Java[EB/OL].http://aspect werkz.Codehaus.org/papers_talks.html.

[6] hBifTs.通過面向方面編程提高代碼的封裝和復(fù)用性[EB/OL].http://www.cnblogs.com/hbifts/articles/7512.html,2004 04 15.

[7] SteeveLee.DotNETAOP[EB/OL].http://www.gotdotnet.com/ Workspaces/Workspace. aspx?id=1b78f7c1-895f-49a7-8fa6-1565db-16d41b. 

作者簡介:靳小強(1981 ),男,碩士研究生,主要研究方向為軟件工程;唐寧九(1960 ),男,教授,碩士生導(dǎo)師,主要研究方向為軟件工程、計算機網(wǎng)絡(luò);胡雪亮(1982 ),男,碩士研究生,研究方向為軟件工程。

注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。

主站蜘蛛池模板: 久久6免费视频| 亚洲一区国色天香| 久久久久青草大香线综合精品 | 国产人人乐人人爱| 特级精品毛片免费观看| 国产第四页| 又黄又爽视频好爽视频| 国产成人精品视频一区二区电影| 久久五月视频| 婷婷久久综合九色综合88| 国产成人三级在线观看视频| 亚洲人人视频| 欧美不卡视频在线| 亚洲天堂久久| 国产乱子伦无码精品小说| 亚洲精品成人片在线观看| 亚洲精品你懂的| 色香蕉影院| 精品欧美视频| 国产亚洲精品91| 九九视频免费在线观看| 国产精品主播| 中文字幕丝袜一区二区| 国产精品久久久精品三级| 国产精品一区二区国产主播| 啊嗯不日本网站| 久久综合色天堂av| 熟妇丰满人妻| 国产成人综合亚洲欧美在| 成人福利在线免费观看| 无码国产伊人| 亚洲AV无码久久精品色欲| 国产精品污视频| 色哟哟精品无码网站在线播放视频| 国产成年女人特黄特色大片免费| 美女一级毛片无遮挡内谢| 国产区在线观看视频| 亚洲欧洲一区二区三区| 中文字幕第4页| 日日摸夜夜爽无码| 91在线丝袜| 久久人妻xunleige无码| 亚洲九九视频| 一区二区影院| 精品福利网| 国产浮力第一页永久地址| aa级毛片毛片免费观看久| 91热爆在线| 综合亚洲网| 亚洲精品国产精品乱码不卞| 日本三级黄在线观看| 国产一区二区三区免费| 欧美激情第一区| 爱爱影院18禁免费| 国产91av在线| 欧美精品在线免费| www欧美在线观看| 91福利免费| www.狠狠| 久久美女精品| 欧美综合区自拍亚洲综合绿色| 91青青视频| 亚洲成人www| 精品国产一二三区| 亚洲国产欧洲精品路线久久| 在线不卡免费视频| 精品久久久久成人码免费动漫| 国产成人久久777777| 91外围女在线观看| 99久久精品美女高潮喷水| 67194在线午夜亚洲 | 午夜福利亚洲精品| 成人国产一区二区三区| 刘亦菲一区二区在线观看| 亚洲国产成人精品一二区| 日本国产精品| 亚洲欧美日韩中文字幕在线一区| 色吊丝av中文字幕| 午夜老司机永久免费看片| 一级高清毛片免费a级高清毛片| 精品无码一区二区三区电影| 日韩欧美高清视频|