• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于Spring?。粒希械臋?quán)限控制應(yīng)用研究

      2009-10-29 10:07林華靈

      林華靈

      摘要:Spring AOP的面向切面編程的能力,解決了傳統(tǒng)面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)在權(quán)限控制應(yīng)用中存在的問題。實(shí)現(xiàn)權(quán)限控制組件的模塊化,業(yè)務(wù)邏輯組件與權(quán)限控制組件的分離和解耦,從而提高組件及代碼的復(fù)用度。

      關(guān)鍵詞:OOP;面向切面編程;Spring AOP;權(quán)限控制

      1 引言

      OOP(Object Oriented Programming,面向?qū)ο蟪绦蛟O(shè)計(jì))中的每個(gè)對(duì)象均由屬性和方法封裝構(gòu)成,是對(duì)客觀物質(zhì)的抽象,對(duì)比傳統(tǒng)的面向結(jié)構(gòu)程序設(shè)計(jì)思想,OOP思想更加接近于客觀世界,是當(dāng)前最主流的編程思想?;诶^承、多態(tài)和封裝等特性的OOP在解決縱向多層次的對(duì)象關(guān)系問題,如繼承、聚合和泛化等,展示出強(qiáng)大能力。但運(yùn)用OOP解決一些橫向關(guān)系的問題,如日志、權(quán)限控制、緩存和事務(wù)等問題,卻無法行之有效。因?yàn)榇祟悊栴}跨越了給定編程模型中的傳統(tǒng)職責(zé)界限。如果使用面向?qū)ο蠹夹g(shù)程序設(shè)計(jì)(OOP)來解決這類問題 ,往往會(huì)使系統(tǒng)衍生大量冗余代碼,組件緊密耦合和可維護(hù)性差等問題。為了彌補(bǔ)面向?qū)ο缶幊碳夹g(shù)解決“橫切”方面問題存在的能力不足, 面向切面編程(Aspect Oriented Programming ,簡(jiǎn)稱AOP)技術(shù)便應(yīng)運(yùn)而生,它的出現(xiàn)有效解決了上述問題,并使系統(tǒng)設(shè)計(jì)開發(fā)變得簡(jiǎn)單而高效 ,并從編程方法學(xué)的角度提供了一種編寫安全程序的有效途徑。

      2 Spring框架技術(shù)與Spring AOP技術(shù)原理

      SpringFramework是開源的J2EE應(yīng)用框架。它的核心是個(gè)輕量級(jí)容器,Spring通過容器管理物件的生命周期、物件的組態(tài)、依賴注入等。旨在簡(jiǎn)化J2EE的開發(fā),降低J2EE項(xiàng)目實(shí)施的難度。Spring幫助實(shí)現(xiàn)了真正的邏輯層和Web層的分離。它是為解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的,Spring使用基本的JavaBeans也就是POJO便可以完成EJB完成的事情。Spring的主要設(shè)計(jì)目標(biāo)是設(shè)計(jì)系統(tǒng)組件就有可重用性、易測(cè)試、簡(jiǎn)單以及松散耦合等特性。

      2.1 Spring框架體系結(jié)構(gòu)

      Spring 框架是一個(gè)分層架構(gòu),由 7 個(gè)定義良好的模塊組成。Spring 模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理 bean 的方式[1]。

      2.2 Spring IoC模式

      當(dāng)我們進(jìn)行項(xiàng)目開發(fā)時(shí),我們將一個(gè)復(fù)雜的系統(tǒng)進(jìn)行有效的劃分,形成多個(gè)模塊,這樣可以使我們有效的理解和控制整個(gè)系統(tǒng),使每個(gè)模塊都能易于理解和維護(hù)。但是模塊之間以某種方式進(jìn)行信息交換的時(shí)候,模塊和模塊之間就不可避免的發(fā)生了某種耦合關(guān)系。但是,如果模塊間過強(qiáng)藕合則會(huì)對(duì)整個(gè)系統(tǒng)來說會(huì)造成很大的潛在危害,特別是當(dāng)需求發(fā)生變化時(shí),代碼維護(hù)的代價(jià)相當(dāng)高。因此我們要盡可能的消解模塊間不必要的藕合,盡量提高系統(tǒng)的可維護(hù)性和組件的復(fù)用度。

      Spring的核心是IoC(Inversion of Control,控制反轉(zhuǎn)),就是為了要解決組件間的耦合而產(chǎn)生的,實(shí)現(xiàn)組件的構(gòu)建和使用分開。所謂“控制反轉(zhuǎn)”就是將原先系統(tǒng)中對(duì)象間關(guān)系的控制權(quán)從程序自身轉(zhuǎn)交給IoC容器。借助IoC能夠降低系統(tǒng)中各個(gè)組件之間的依賴關(guān)系,實(shí)現(xiàn)解降藕的目的。

      Spring IoC主要通過依賴注入的方式實(shí)現(xiàn)對(duì)象控制的反轉(zhuǎn)。即在組件設(shè)計(jì)時(shí),避免采用靜態(tài)編碼的形式描述組件間的相互依賴關(guān)系,而是在系統(tǒng)運(yùn)行期間,由Spring IoC容器依據(jù)Spring 上下文的描述,動(dòng)態(tài)地將目標(biāo)對(duì)象實(shí)例注入到各個(gè)關(guān)聯(lián)組件中。

      Spring AOP可以解決傳統(tǒng)面向?qū)ο缶幊?OOP)中不能夠很好解決的“橫切關(guān)注點(diǎn)”(CrossCut)方面的問題,例如,在應(yīng)用開發(fā)中需要解決的安全、事務(wù)、日志等公共功能問題。盡管這些問題的解決與系統(tǒng)業(yè)務(wù)邏輯實(shí)現(xiàn)無關(guān),但解決的好壞影響著系統(tǒng)的健壯和穩(wěn)定,命運(yùn)攸關(guān)系統(tǒng)開發(fā)的成敗。而以傳統(tǒng)方式解決“橫切關(guān)注點(diǎn)”問題,通常是將公共功能代碼散布并靜態(tài)嵌入到各個(gè)業(yè)務(wù)邏輯組件中,因此“橫切關(guān)注點(diǎn)”問題的解決代碼與業(yè)務(wù)邏輯組件緊密耦合。一旦需要對(duì)公共功能代碼做修改,必須逐個(gè)找出應(yīng)用該代碼的業(yè)務(wù)邏輯組件,再逐一修改。而Spring AOP解決這些問題的方法首先是將業(yè)務(wù)邏輯方面的解決和“橫切關(guān)注點(diǎn)”方面問題的解決相分離;其次是將“橫切關(guān)注點(diǎn)”問題的解決實(shí)現(xiàn)集中化、模塊化處理。下面是關(guān)于Spring AOP的重要概念[1]:

      切面(Aspect):一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)可能會(huì)橫切多個(gè)對(duì)象。事務(wù)管理是J2EE應(yīng)用中一個(gè)關(guān)于橫切關(guān)注點(diǎn)的很好的例子。在Spring AOP中,切面可以使用基于模式)或者基于@Aspect注解的方式來實(shí)現(xiàn)。

      連接點(diǎn)(Joinpoint):在程序執(zhí)行過程中某個(gè)特定的點(diǎn),比如某方法調(diào)用的時(shí)候或者處理異常的時(shí)候。在Spring AOP中,一個(gè)連接點(diǎn)總是表示一個(gè)方法的執(zhí)行。

      通知(Advice):在切面的某個(gè)特定的連接點(diǎn)上執(zhí)行的動(dòng)作。其中包括了“around”、“before”和“after”等不同類型的通知(通知的類型將在后面部分進(jìn)行討論)。許多AOP框架(包括Spring)都是以攔截器做通知模型,并維護(hù)一個(gè)以連接點(diǎn)為中心的攔截器鏈。

      切入點(diǎn)(Pointcut):匹配連接點(diǎn)的斷言。通知和一個(gè)切入點(diǎn)表達(dá)式關(guān)聯(lián),并在滿足這個(gè)切入點(diǎn)的連接點(diǎn)上運(yùn)行(例如,當(dāng)執(zhí)行某個(gè)特定名稱的方法時(shí))。

      織入(Weaving):把切面連接到其它的應(yīng)用程序類型或者對(duì)象上,并創(chuàng)建一個(gè)被通知的對(duì)象。這些可以在編譯時(shí)(例如使用AspectJ編譯器),類加載時(shí)和運(yùn)行時(shí)完成。Spring和其他純Java AOP框架一樣,在運(yùn)行時(shí)完成織入。

      因?yàn)镾pringAOP解決“橫切”方面問題采用了動(dòng)態(tài)代理的實(shí)現(xiàn)機(jī)制,把切面連接到切點(diǎn)上,并創(chuàng)建一個(gè)被通知的對(duì)象這個(gè)過程通常在編譯時(shí),類加載時(shí)和運(yùn)行時(shí)完成。而并非預(yù)先靜態(tài)嵌入代碼的方式,所以我們還需要在Advice(通知)執(zhí)行的時(shí)機(jī)預(yù)先做好定義。在Spring AOP中,通知切面(Aspect)織入切點(diǎn)(Pointcut)的時(shí)機(jī)可分為:前置通知、后置通知、異常通知、最終通知和環(huán)繞通知。

      3基于Spring AOP的權(quán)限控制組件實(shí)現(xiàn)

      權(quán)限控制是企業(yè)級(jí)Web應(yīng)用系統(tǒng)中不可或缺的功能之一,是Web系統(tǒng)運(yùn)行的重要的安全保障。Spring AOP在Web系統(tǒng)的用戶權(quán)限控制方面具有強(qiáng)大的能力。以在線考試系統(tǒng)為例,系統(tǒng)包含了權(quán)限控制的實(shí)現(xiàn),不同的用戶被授予不同的權(quán)限。例如考生的權(quán)限僅限于特定時(shí)間的考試和成績(jī)查詢,系統(tǒng)管理員的權(quán)限包含添加考生、刪除考生、增加試題等更高層次的操作。因此針對(duì)于某些較高權(quán)限的操作,我們可以在操作前先進(jìn)行用戶的權(quán)限檢查。權(quán)限檢查通過,則用戶方可以繼續(xù)執(zhí)行持久化操作。權(quán)限檢查與實(shí)際的業(yè)務(wù)邏輯無關(guān),而屬于安全相關(guān)的“橫切”方面的問題。針對(duì)這個(gè)案例,我們給出了兩種解決方案:

      解決方案一:我們?cè)谙到y(tǒng)的業(yè)務(wù)邏輯組件中凡是涉及持久化實(shí)現(xiàn)的方法都插入權(quán)限檢查方法的代碼,使得當(dāng)用戶進(jìn)行任何方式的持久化操作之前,都先執(zhí)行權(quán)限檢查方法;這是AOP提出之前,解決橫切問題的通常做法。但是采用這種大面積嵌入靜態(tài)代碼做法產(chǎn)生的問題是代碼冗余了,而且使業(yè)務(wù)邏輯組件對(duì)權(quán)限檢查組件的緊密耦合,不利于系統(tǒng)的擴(kuò)展和升級(jí)。譬如,當(dāng)需要對(duì)安全代碼作變更的時(shí)候,需要找出所有業(yè)務(wù)邏輯方法,手工一一加入權(quán)限控制代碼,采用這種方案效率低下,且不易維護(hù)。

      解決方案二:采用AOP(面向切面編程)的解決方案,將散布在各個(gè)業(yè)務(wù)邏輯組件中權(quán)限控制代碼同業(yè)務(wù)邏輯代碼相分離,并實(shí)現(xiàn)權(quán)限控制代碼的模塊化、組件化處理。Spring AOP采用了動(dòng)態(tài)代理的方式,避免了在所有切點(diǎn)上加入靜態(tài)的權(quán)限檢查代碼,因此解決了代碼重復(fù)的問題。

      在線考試系統(tǒng)中業(yè)務(wù)邏輯組件ExamServiceImpl的用戶權(quán)限檢查就采用了Spring AOP實(shí)現(xiàn)。下面是以業(yè)務(wù)邏輯組件ExamServiceImpl為例,介紹Spring AOP思想在本應(yīng)用系統(tǒng)中的實(shí)現(xiàn)。Spring上下文中的配置:

      這段Spring上下文首先將權(quán)限檢查組件類AuthorityCheck和業(yè)務(wù)邏輯組件類ExamServiceImpl定義為Bean類,這樣當(dāng)需要用到這兩個(gè)組件時(shí)候,Spring IoC容器便會(huì)向程序注入兩個(gè)類的實(shí)例,實(shí)現(xiàn)了控制反轉(zhuǎn)(IoC)。

      定義了權(quán)限檢查組件(AuthorityCheck)為“切面”(aspect),由于上下中前面已聲明AuthorityCheck,因此我們將切面聲明標(biāo)簽的name屬性改為ref指向AuthorityCheck 類;

      聲明了切點(diǎn)(pointcut)為org.service.ExamServiceImpl類下的所有方法。

      聲明了前置通知為checkSecurity方法,一旦追蹤并捕獲目標(biāo)方法(ExamServiceImpl類下所有方法)即將被執(zhí)行的消息,權(quán)限檢查方法(checkSecurity)先被調(diào)用執(zhí)行。權(quán)限檢查通過,用戶方可實(shí)現(xiàn)執(zhí)行ExamServiceImpl類下的添加考生、刪除考生、添加試題等所有方法。權(quán)限檢查失敗,拋出異常,提示用戶權(quán)限等級(jí)不夠,不能執(zhí)行相關(guān)操作。

      因此Spring AOP為解決“橫切”方面問題,提供了出色的方案。

      結(jié)束語

      Spring AOP建立在Spring IoC機(jī)制之上,Spring AOP的攔截(interception)能力,提供了“在所有對(duì)象的方法調(diào)用前/后加入自定義行為”的攔截能力。促使軟件開發(fā)人員對(duì)用戶權(quán)限控制等公共功能實(shí)現(xiàn)模塊化、組件化,從而消除了OOP引起的代碼冗余和混亂問題,增強(qiáng)了系統(tǒng)的可維護(hù)性和代碼的重用性,并最終實(shí)現(xiàn)系統(tǒng)的解降藕的目的。

      參考文獻(xiàn)

      [1]林信良.Spring技術(shù)手冊(cè).北京:電子工業(yè)出版社,2006

      [2]劉斌.Java Web整合開發(fā)[M].電子工業(yè)出版社,2007(11)

      [3]劉昆.基于J2EE平臺(tái)的輕量級(jí)框架的應(yīng)用研究[D]. 武漢理工大學(xué),2008

      [4]楊少波,顧益軍.J2EE項(xiàng)目實(shí)訓(xùn)--Spring框架技術(shù),2008(5)

      [5]李剛.整合Struts+Hibernate+Spring應(yīng)用開發(fā)詳解,2007(11)

      和田市| 大渡口区| 乐陵市| 红安县| 富裕县| 仲巴县| 乌兰察布市| 庆安县| 屏边| 东明县| 山西省| 梁山县| 什邡市| 乐安县| 剑阁县| 济南市| 布尔津县| 常熟市| 湾仔区| 鲁山县| 镇康县| 凤凰县| 盐源县| 漳浦县| 金秀| 尚志市| 沈丘县| 崇信县| 屯昌县| 子洲县| 全南县| 民丰县| 南安市| 泽普县| 永靖县| 英吉沙县| 台安县| 哈密市| 抚远县| 自治县| 阳城县|