摘要:WEB應(yīng)用程序除了通過(guò)自身提供的菜單或者是按鈕進(jìn)行WEB頁(yè)面的流轉(zhuǎn)外,還可以通過(guò)URL輸入框進(jìn)行頁(yè)面的流轉(zhuǎn)。這種現(xiàn)象為WEB應(yīng)用程序的設(shè)計(jì)帶來(lái)了一定的難度,處理不當(dāng)將會(huì)出現(xiàn)意想不到的錯(cuò)誤。該文通過(guò)使用java servlet過(guò)濾器技術(shù),xml文檔,實(shí)現(xiàn)對(duì)WEB頁(yè)面的訪問(wèn)控制,可以有效解決上述問(wèn)題。
關(guān)鍵詞:java servlet;過(guò)濾器;自定義標(biāo)簽;xml
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2009)36-10587-03
Controlling WEB by XML and FILTER
ZHANG Qing-hui1, LI Hai-tao2
(1.Communication Department of Naval Headquarters, Beijing 100841, China; 2.Department of Naval Logistical, Beijing 100841, China)
Abstract: This is a direction that Application was deployed in WWW. But, there is very much difference in the form of accessing between Web application and local application. The main difference is that Web application which can be called by inputting URL in browse. Programmer should consider these factors. If did not consider it, it would cause any trouble. The essay introduce some method about servlet filter and xml document, will resolve the question.
Key words: Java servlet; fliter; self-definition tag of jsp; Xml
目前,基于Web客戶端的主要任務(wù)是展現(xiàn)信息內(nèi)容,而HTML語(yǔ)言則是信息展現(xiàn)的最有效載體之一。最初的HTML語(yǔ)言只能在瀏覽器中展現(xiàn)靜態(tài)的文本或圖像信息,人們對(duì)信息豐富性和多樣性的需求。由靜態(tài)技術(shù)向動(dòng)態(tài)技術(shù)的轉(zhuǎn)變成為了Web客戶端技術(shù)演進(jìn)的永恒定律。
當(dāng)動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)發(fā)展成熟以后,人們對(duì)WEB應(yīng)用程序的要求越來(lái)越復(fù)雜,從而導(dǎo)致了WEB應(yīng)用程序的軟件架構(gòu)越來(lái)越復(fù)雜,這時(shí)產(chǎn)生新的問(wèn)題――WEB應(yīng)用程序的訪問(wèn)控制。本文只對(duì)最基本的頁(yè)面之間的流轉(zhuǎn)進(jìn)行控制,而對(duì)用戶權(quán)限相關(guān)的訪問(wèn)控制不做介紹。因?yàn)榭梢詮淖罨镜捻?yè)面流轉(zhuǎn)的控制中發(fā)現(xiàn)用戶權(quán)限的控制只是它的一個(gè)子集,當(dāng)WEB應(yīng)用程序的訪問(wèn)控制設(shè)計(jì)的足夠靈活(與其它功能之間足夠松耦合),就可以修改它,從而達(dá)到實(shí)現(xiàn)用戶權(quán)限的訪問(wèn)控制。
1 流行的WEB應(yīng)用程序訪問(wèn)控制
流行的WEB應(yīng)用程序訪問(wèn)控制可以依賴在每個(gè)頁(yè)面(如jsp,asp,php)或者是服務(wù)器邊代碼(如 servlet)中加入訪問(wèn)控制代碼對(duì)其進(jìn)行控制[1]。這種訪問(wèn)控制的缺點(diǎn)顯而易見(jiàn),就是和非訪問(wèn)控制功能代碼聯(lián)系過(guò)于緊密,從而導(dǎo)致訪問(wèn)控制代碼的可維護(hù)性和通用性低下。隨著應(yīng)用程序功能的增加,這種缺陷更加明顯。針對(duì)當(dāng)前的訪問(wèn)控制可以得到以下的結(jié)論[2]:
1) 訪問(wèn)控制的粒度大小與應(yīng)用程序的復(fù)雜度呈正比;
2) 訪問(wèn)控制的代碼與應(yīng)用程序的非訪問(wèn)控制代碼的關(guān)系密切,可維護(hù)性和可重用性差;
3) 訪問(wèn)控制的真正實(shí)現(xiàn)可能牽涉太多的應(yīng)用模型,導(dǎo)致學(xué)習(xí)成本的提高 [3]。
2 XML構(gòu)成WEB應(yīng)用程序頁(yè)面模型
2.1 XML實(shí)現(xiàn)樹型結(jié)構(gòu)
XML(Extensible Markup Language,可擴(kuò)展標(biāo)記語(yǔ)言),是一種用系統(tǒng)無(wú)關(guān)的方式表示數(shù)據(jù)的結(jié)構(gòu)化語(yǔ)言。xml文件包括三部分:XML聲明、處理指令(可選)、XML元素。XML文檔的一個(gè)基本要求是結(jié)構(gòu)良好的(well formed),一個(gè)結(jié)構(gòu)良好的XML文檔要包含這三個(gè)部分[4]。下面對(duì)XML進(jìn)行簡(jiǎn)單介紹:
1) XML聲明形式 處理指令以結(jié)束。在
2) 處理指令是用來(lái)給處理XML文件的應(yīng)用程序提供信息的。所有的處理指令應(yīng)該遵循下面的格式 ,規(guī)則與XML聲明形式相同。
3) XML元素是XML文件內(nèi)容的基本單元。所有的XML元素應(yīng)該遵循下面的格式 <標(biāo)記>數(shù)據(jù)內(nèi)容,元素里還可以再嵌套元素,實(shí)現(xiàn)循環(huán)嵌套。最外層的元素稱為根元素。一個(gè)xml文檔只能有一個(gè)根元素。
可以看出,XML是個(gè)結(jié)構(gòu)良好的樹型層次。那么,將web應(yīng)用程序的頁(yè)面之間相互鏈接用XML表示就成了順理成章的事情了。當(dāng)樹型模型被建立后,接下來(lái)就是要解決訪問(wèn)模型的途徑了。本文將通過(guò)介紹JAXP(java api for xml processing)實(shí)現(xiàn)對(duì)XML進(jìn)行訪問(wèn)。
2.2 JAXP 解析 XML
Jaxp是java 操作xml 文檔的工具,其建立在sax和dom(document object model)解析器的基礎(chǔ)之上,自身并不解析xml,僅僅是調(diào)用上述解析器去實(shí)現(xiàn)解析功能。其目的在于使jaxp的代碼與特定的xml解析器無(wú)關(guān),易于移植。由于web應(yīng)用程序訪控制的性質(zhì)決定了將會(huì)頻繁訪問(wèn)該xml文檔,所以本文將采用以dom解析器為基礎(chǔ)的jaxp api 處理xml文檔[5]。
Dom文檔對(duì)象模型是一個(gè)普通的樹狀結(jié)構(gòu)。每個(gè)節(jié)點(diǎn)來(lái)自于xml文檔的一個(gè)元素(包含其它元素)或文本(不包含其它元素或xml標(biāo)記)。我們利用jaxp中的相關(guān)api將xml文件轉(zhuǎn)換成dom 對(duì)象,便于使用其它java api 去訪問(wèn)整個(gè)dom 對(duì)象。過(guò)程如下:
1) 導(dǎo)入相關(guān)的java api,主要包括:
javax.xml.parsers.DocumentBuilder;
javax.xml.parsers.DocumentBuilderFactory;
org.w3c.dom.Document;
2) 將xml文檔轉(zhuǎn)換成dom 對(duì)象:
//生成工廠類
DocumentBuildeFactory
factory=DocumentBuildeFactory. newInstance();
//實(shí)例化一個(gè)dom解析器
DocumentBuilde builder= factory.new Docum- entBuilder();
//將xml文檔解析成dom對(duì)象
Document document=builder. Parse(“xml文檔路徑”);
3) dom對(duì)象在訪問(wèn)控制中的匹配過(guò)程:
//訪問(wèn)dom對(duì)象中的子元素
Element elements=document getDocumentElement ();
//獲得將匹配的元素中所有節(jié)點(diǎn)
NodeList nodelists=get ElementsByTagName(“匹配元素名稱”);
//匹配父節(jié)點(diǎn)名稱是否存在于本節(jié)點(diǎn)允許范圍內(nèi)
Node nodes;
目前為止,已經(jīng)可以使用xml文檔代表一個(gè)web應(yīng)用程序的結(jié)構(gòu)關(guān)系了。并且也實(shí)現(xiàn)了如何匹配一個(gè)父節(jié)點(diǎn)鏈接到本節(jié)點(diǎn)合法性判斷問(wèn)題。其具體設(shè)計(jì)流程如下所述:
1) web應(yīng)用程序結(jié)構(gòu)示例
如圖1所示,web應(yīng)用程序結(jié)構(gòu)一般存在四個(gè)頁(yè)面,index是啟動(dòng)頁(yè)面,pageA只存在一個(gè)父頁(yè)面(index);pageB存在二個(gè)父頁(yè)面(index、pageC);pageC存在二個(gè)父頁(yè)面(index、pageB)。
2) 根據(jù)web應(yīng)用程序結(jié)構(gòu)建立xml文檔
/
3 filter實(shí)現(xiàn)web應(yīng)用程序訪問(wèn)控制
Filter(過(guò)濾器)是一個(gè)程序,它先于與之相關(guān)的servlet或JSP頁(yè)面運(yùn)行在服務(wù)器上。過(guò)濾器可附加到一個(gè)或多個(gè)servlet或JSP頁(yè)面上,并且可以檢查進(jìn)入這些資源的請(qǐng)求信息。
3.1 filter 的實(shí)現(xiàn)
在java web service中實(shí)現(xiàn)一個(gè)filter必須執(zhí)行以下基本步驟:
1) 建立一個(gè)實(shí)現(xiàn)Filter接口的類。這個(gè)類需要三個(gè)方法,分別是:doFilter、init和destroy。
2) doFilter方法包含主要的過(guò)濾代碼,init方法建立設(shè)置操作,而destroy方法進(jìn)行清除。在doFilter方法中放入過(guò)濾行為。doFilter方法的第一個(gè)參數(shù)為ServletRequest對(duì)象。此對(duì)象給過(guò)濾器提供了對(duì)進(jìn)入的信息(包括表單數(shù)據(jù)、cookie和HTTP請(qǐng)求頭)的完全訪問(wèn)。第二個(gè)參數(shù)為ServletResponse,通常在簡(jiǎn)單的過(guò)濾器中忽略此參數(shù)。最后一個(gè)參數(shù)為FilterChain,如下一步所述,此參數(shù)用來(lái)調(diào)用servlet或JSP頁(yè)[6]。
3) 調(diào)用FilterChain對(duì)象的doFilter方法。Filter接口的doFilter方法取一個(gè)FilterChain對(duì)象作為它的一個(gè)參數(shù)。在調(diào)用此對(duì)象的doFilter方法時(shí),激活下一個(gè)相關(guān)的過(guò)濾器。如果沒(méi)有另一個(gè)過(guò)濾器與servlet或JSP頁(yè)面關(guān)聯(lián),則servlet或JSP頁(yè)面被激活。
4) 對(duì)相應(yīng)的servlet和JSP頁(yè)面注冊(cè)過(guò)濾器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
3.2 將xml和filter集成
將xml轉(zhuǎn)換成document對(duì)象的代碼放入filter 接口中的init方法中,init方法僅僅執(zhí)行一次,直到服務(wù)器關(guān)閉為止。再將dom 對(duì)象的匹配過(guò)程放在dofilter方法中,當(dāng)匹配成功,就流轉(zhuǎn)到既定頁(yè)面;反之,流轉(zhuǎn)到默認(rèn)出錯(cuò)頁(yè)面。邏輯過(guò)程如圖2所示。
通過(guò)xml和filter的集成,對(duì)于web應(yīng)用程序的訪問(wèn)控制就可以實(shí)現(xiàn)。當(dāng)web應(yīng)用程序的訪問(wèn)規(guī)則方式變化時(shí),只要對(duì)xml文檔中的內(nèi)容進(jìn)行相應(yīng)的修改即可。在文章開(kāi)始時(shí)就提到關(guān)于身份用戶權(quán)限相關(guān)的訪問(wèn)控制是web應(yīng)用程序頁(yè)面訪問(wèn)控制的一個(gè)子集,如何實(shí)現(xiàn)用戶的權(quán)限呢?其實(shí)也只要修改xml文檔的形式即可。
4 結(jié)論
Xml和filter技術(shù)相當(dāng)成熟,通過(guò)二者的集成,就可實(shí)現(xiàn)對(duì)程序的控制。本文對(duì)web應(yīng)用程序的訪問(wèn)控制提出了應(yīng)用級(jí)的解決方案,隨著對(duì)訪問(wèn)控制的要求不斷增加,應(yīng)該把filter中的控制程序提取出來(lái),形成應(yīng)該業(yè)務(wù)類,而在filter中僅僅對(duì)業(yè)務(wù)類進(jìn)行相應(yīng)的調(diào)用,這時(shí),關(guān)于本文說(shuō)闡述的web應(yīng)用程序訪問(wèn)控制才形成模塊。可以看出,做為一個(gè)良好的模塊,應(yīng)該將xml文檔根據(jù)需求進(jìn)行更詳細(xì)的劃分,使其不僅在訪問(wèn)控制模塊中發(fā)揮作用,而且在用戶管理方面也發(fā)揮作用,最終將web應(yīng)用程序系統(tǒng)管理徹底與業(yè)務(wù)管理分割開(kāi)來(lái)。
參考文獻(xiàn):
[1] 武孟軍.簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP)[M].北京:人民郵電出版社,2006.
[2] 張楠,張振國(guó).客戶端/服務(wù)器模式中傳輸層協(xié)議的比較與選擇[J].網(wǎng)絡(luò)與通信,2006,22(9-3):200-202.
[3] 王紹斌,王昭順.信息系統(tǒng)攻擊與防御[M].北京:電子工業(yè)出版社,2007.
[4] 尹建璋.無(wú)線局域網(wǎng)網(wǎng)絡(luò)安全措施改進(jìn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(11):2745-2747.
[5] 欒昌海.異構(gòu)網(wǎng)絡(luò)下的Web監(jiān)控系統(tǒng)設(shè)計(jì)研究[J].微計(jì)算機(jī)信,2008,24(7-3):81,101-102.
[6] 吳媛,陳正軍,李雄德.基于SNMP校園網(wǎng)網(wǎng)絡(luò)管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù):學(xué)術(shù)交流,2009,5(15):3925-3926.