李洪文
摘要介紹一種基于URL重寫技術(shù)的電子資源統(tǒng)一授權(quán)訪問系統(tǒng)的原理和實(shí)現(xiàn),以及在開發(fā)中遇到的問題和解決方法。該系統(tǒng)不僅可以作為電子資源的統(tǒng)一訪問門戶,還可以應(yīng)用于校外讀者訪問圖書館的電子資源。
關(guān)鍵詞電子資源URL重寫代理服務(wù)器單點(diǎn)登錄
1、國(guó)內(nèi)電子資源統(tǒng)一授權(quán)訪問系統(tǒng)發(fā)展現(xiàn)狀
隨著web技術(shù)的日臻成熟,圖書館內(nèi)的各種Web資源數(shù)量越來(lái)越多,包括圖書館自建的資源網(wǎng)站、購(gòu)置的國(guó)內(nèi)外電子資源、業(yè)務(wù)管理網(wǎng)站、以及圖書館自動(dòng)化系統(tǒng)的OPAC網(wǎng)站等等。隨著資源的增多,帶來(lái)幾個(gè)主要問題:如何采用統(tǒng)一的界面對(duì)使用情況進(jìn)行各種統(tǒng)計(jì);如何實(shí)現(xiàn)這些資源的統(tǒng)一授權(quán)訪問;如何實(shí)現(xiàn)讀者在校外訪問這些資源。
面對(duì)這些問題,高校圖書館都作了相應(yīng)嘗試,目前在國(guó)內(nèi)實(shí)現(xiàn)大概有三種方式:
1.1代理服務(wù)器方式
比較常見的方式。該方式在授權(quán)管理上,利用代理服務(wù)器提供的用戶管理功能,在客戶端瀏覽器上設(shè)置好代理,然后可以暢通地訪問圖書館提供的各種網(wǎng)站。利用代理服務(wù)器的簡(jiǎn)單日志作使用情況的簡(jiǎn)單統(tǒng)計(jì)分析。只要把代理服務(wù)器的端口和IP在防火墻上開通,校外讀者也可以訪問。
1.2虛擬專用網(wǎng)絡(luò)(VPN)方式
通過購(gòu)買VPN硬件或者使用價(jià)廉的軟件VPN,在網(wǎng)絡(luò)傳輸層實(shí)現(xiàn)授權(quán)訪問,統(tǒng)計(jì)數(shù)據(jù)是基于IP地址以及端口的流量報(bào)告,通過分發(fā)一些校外的VPN帳號(hào)實(shí)現(xiàn)校外的資源訪問。因?yàn)閂PN是基于傳輸層,只關(guān)心IP數(shù)據(jù)包正確地實(shí)現(xiàn)端到端的傳輸,因此不分析應(yīng)用層的HTTP協(xié)議,所以無(wú)法對(duì)URL進(jìn)行統(tǒng)計(jì)分析。權(quán)限控制方面只能做到對(duì)IP的黑白名單控制,對(duì)于同一臺(tái)資源服務(wù)器上的多個(gè)網(wǎng)站應(yīng)用,就無(wú)能為力了。
1.3基于重寫URL技術(shù)的方式
以國(guó)外的EZProxy軟件為主。在國(guó)外,URL重寫技術(shù)已經(jīng)得到較為廣泛的應(yīng)用?;赨RL重寫技術(shù)的系統(tǒng),更容易被讀者使用,無(wú)需客戶端。主要有以下5個(gè)方面的優(yōu)點(diǎn)。
(1)實(shí)現(xiàn)所有管轄網(wǎng)站的透明訪問。
(2)可以實(shí)現(xiàn)網(wǎng)站間的單點(diǎn)登錄。因?yàn)閁RL重寫服務(wù)器本身使用的就是HTTP協(xié)議,因此在多個(gè)網(wǎng)站間通過架設(shè)一個(gè)認(rèn)證服務(wù)器,通過跨域名Cook-ie技術(shù),容易實(shí)現(xiàn)單點(diǎn)登錄。用戶在門戶網(wǎng)站登錄后,再進(jìn)入各個(gè)資源。
(3)實(shí)現(xiàn)用戶權(quán)限統(tǒng)一管理。在使用該系統(tǒng)前,學(xué)校校園網(wǎng)當(dāng)有IP地址調(diào)整的時(shí)候,需要對(duì)每種電子資源進(jìn)行授權(quán)IP地址的修改。使用該系統(tǒng)后,統(tǒng)一進(jìn)行IP用戶管理,只需要添加一次即可。
(4)既可以在URL級(jí)別非常容易地實(shí)現(xiàn)各種統(tǒng)計(jì),比如訪問次數(shù);也可在網(wǎng)絡(luò)流量上進(jìn)行各種統(tǒng)計(jì)??梢宰龀筛鞣N折線圖、統(tǒng)計(jì)報(bào)表,來(lái)反映各類資源在某個(gè)時(shí)間段內(nèi)的使用情況。
(5)可以實(shí)現(xiàn)多臺(tái)主機(jī)負(fù)載均衡,實(shí)現(xiàn)無(wú)瓶頸訪問。山東大學(xué)目前共有4臺(tái)主機(jī)做訪問的動(dòng)態(tài)均衡。在多臺(tái)主機(jī)間通過身份認(rèn)證服務(wù)實(shí)現(xiàn)單點(diǎn)登錄。
經(jīng)過對(duì)三種解決方案的利弊權(quán)衡,山東大學(xué)圖書館采用URL重寫技術(shù),與公司合作,對(duì)原有的校外訪問系統(tǒng)進(jìn)行改造,協(xié)同開發(fā)了一套適合高校圖書館的資源統(tǒng)一授權(quán)訪問系統(tǒng)。
2、URL重寫的方式
2.1基于URL地址的重寫
URL地址重寫就是把網(wǎng)站的URL地址以及網(wǎng)頁(yè)中的所有真實(shí)URL地址(包括圖片、FLASH、鏈接等),轉(zhuǎn)換成一個(gè)以重寫代理服務(wù)器地址開頭,其后緊跟著該URL地址的一個(gè)長(zhǎng)URL地址。
比如圖書館OPAC的地址是http://202.194.11.6/,URL重寫代理服務(wù)器的地址是http://url-proxy1.my.com/,那么經(jīng)過URL重寫后的OPAC的地址可以是:http://urlproxy1.my.com/202.194.11.6/。然后把202.194.11.6服務(wù)器的80端口通過防火墻關(guān)閉,發(fā)布公開的地址http://urlproxy1.my.com/202.194.11.6/作為所有讀者訪問的地址。
鑒于重寫后的URL地址太長(zhǎng),上述例子的改進(jìn)方案可以為202.194.11.6起個(gè)別名,然后重定向到這個(gè)URL地址。比如改為:http://urlproxy.1my.com/opac/,當(dāng)讀者從瀏覽器訪問這個(gè)地址的時(shí)候,實(shí)際上是訪問的OPAC 202.194.11.6網(wǎng)站的內(nèi)容。
網(wǎng)站HTML頁(yè)面里的所有的URL地址,都必須得到重寫,否則當(dāng)用戶在這個(gè)頁(yè)面點(diǎn)擊沒有被重寫的URL鏈接,瀏覽器就會(huì)轉(zhuǎn)向鏈接所指向的原始的網(wǎng)站去了,不會(huì)通過我們的重寫服務(wù)器。系統(tǒng)會(huì)對(duì)頁(yè)面里大多數(shù)URL地址進(jìn)行自動(dòng)重寫。但因?yàn)榫W(wǎng)頁(yè)內(nèi)Javascript腳本復(fù)雜多樣,計(jì)算機(jī)不能全部識(shí)別。因此對(duì)于部分網(wǎng)頁(yè)需要通過配置過濾器,來(lái)告知重寫服務(wù)器對(duì)這些腳本中的URL如何重寫。這種方式的優(yōu)點(diǎn)是服務(wù)器只需要用一個(gè)端口即可實(shí)現(xiàn)所有電子資源的訪問。
因基于URL地址重寫的靈活性和硬件配置要求低的優(yōu)點(diǎn),我們采取了這種方式。
2.2基于端口的重寫
就是把電子資源URL的主機(jī)端口,影射到重寫服務(wù)器的某個(gè)端口。例如:把www.cnki.net端口影射到urlproxy.my.com:8000上,把www.sciencedirect.com影射到urlproxy.my.com:80001上。基于端口重寫的優(yōu)點(diǎn)是大大降低重寫配置難度,但是缺點(diǎn)是明顯的,每增加一個(gè)資源,需要單位防火墻開放一個(gè)端口。
3、開發(fā)平臺(tái)的選擇
采用J2EE開發(fā)平臺(tái),Tomcat6.0作為Servlet容器,JDK采用1.6版本,數(shù)據(jù)庫(kù)采用MySQL 5。開發(fā)集成環(huán)境采用Eclipse 3.0,后臺(tái)系統(tǒng)管理采用Struts1.3,并基于Ajax技術(shù)的ExtJS 2.0作為管理框架。
4、系統(tǒng)的基本實(shí)現(xiàn)
4.1重寫器的實(shí)現(xiàn)
采用java.util.regex包中提供的標(biāo)準(zhǔn)正則表達(dá)式類庫(kù),通過寫URL地址的匹配正則表達(dá)式,來(lái)對(duì)網(wǎng)頁(yè)內(nèi)容進(jìn)行搜索和替換。共有3種類型的重寫器:
(1)基本的HTML標(biāo)簽重寫器。如A、IMG、FORM等標(biāo)簽中的HREF、SRC、ACTION屬性等等,這些屬性的值一般都是URL地址,需要將這些地址進(jìn)行重寫處理。
(2)腳本重寫器。對(duì)之間的內(nèi)容進(jìn)行表達(dá)式分析,抽取地址相關(guān)的內(nèi)容進(jìn)行地址重寫。
(3)自定義重寫器。上述兩個(gè)重寫器都是系統(tǒng)自動(dòng)完成的。對(duì)于少數(shù)網(wǎng)站可能還有些地址沒有被檢測(cè)和重寫到,那么用戶可以自己定義重寫器。
此外,需要對(duì)HTTP回應(yīng)數(shù)據(jù)進(jìn)行檢測(cè),只對(duì)文本的回應(yīng)進(jìn)行重寫。圖片等二進(jìn)制數(shù)據(jù)不作重寫處理。有些gzip或者deflate格式的二進(jìn)制數(shù)據(jù),需要解壓縮后再進(jìn)行重寫,可以采用java.util.zip.GZIP-
InputStream類和java.util.zip.InflaterInputStream類解壓縮。
4.2后臺(tái)Web管理的實(shí)現(xiàn)
采用基于Ajax技術(shù)的胖客戶端方式,ExtJs 2.0作為UI框架,實(shí)現(xiàn)用戶管理、授權(quán)管理、電子資源管理、流量動(dòng)態(tài)監(jiān)控、流量分析、資源使用率和點(diǎn)擊率等分析。
4.3與圖書館統(tǒng)一認(rèn)證系統(tǒng)的掛接
采用Saml標(biāo)準(zhǔn),與圖書館認(rèn)證中心提供的Web-Service進(jìn)行交互,實(shí)現(xiàn)統(tǒng)一身份認(rèn)證和單點(diǎn)登陸。
5、開發(fā)中遇到的問題及解決方法
5.1瀏覽器Cookie數(shù)量限制的問題
如果同時(shí)訪問了2~3個(gè)資源,就有可能出現(xiàn)某個(gè)資源經(jīng)常提示未登錄。這是Web瀏覽器關(guān)于Cookie個(gè)數(shù)的限制所導(dǎo)致的。根據(jù)rfe2965(Cookie規(guī)范)里定義的,對(duì)于一個(gè)瀏覽器同時(shí)能夠存儲(chǔ)的Cookie數(shù)量:
(1)總共300個(gè)Cookie。
(2)每個(gè)Cookie 4K的存儲(chǔ)容量。
(3)每一個(gè)域名或者服務(wù)器20個(gè)Cookie。
把所有的電子資源都放在URL重寫服務(wù)器下訪問,會(huì)導(dǎo)致這些電子資源的Cookie都存儲(chǔ)在一個(gè)域名里。因此,如果代理的電子資源數(shù)多了,瀏覽器只會(huì)保留最近20個(gè)Cookie,而其余的將全部丟棄。登錄的會(huì)話ID(SessionlD)是首先保存在瀏覽器Cookie中的,因此當(dāng)Cookie個(gè)數(shù)超過20個(gè)的時(shí)候,也是首先被丟棄的,所以電子資源會(huì)頻頻出現(xiàn)登錄提示。
有兩種解決方案,我們采用的是前者。
(1)將Cookie存儲(chǔ)在客戶端。
Cookie經(jīng)過特殊編碼,將多個(gè)Cookie合并為一個(gè)Cookie,存儲(chǔ)在客戶端的瀏覽器中。用戶每發(fā)送一次請(qǐng)求,URL重寫服務(wù)器從代理后的目標(biāo)網(wǎng)站傳回的Response中提取該資源網(wǎng)站所有的Cookie,將這些cookie壓縮和編碼,生成一個(gè)新的Cookie,然后通過Set-Cookie發(fā)給Web瀏覽器進(jìn)行存儲(chǔ),這是Cookie的壓縮過程。重寫器訪問目標(biāo)網(wǎng)站的時(shí)候,會(huì)根據(jù)Web瀏覽器提供的壓縮后的Cookie,將其解壓縮還原成多個(gè)Cookie,再發(fā)送到目標(biāo)資源網(wǎng)站,這是Cookie的解壓縮過程。通過這種方案,可以允許用戶同時(shí)訪問19個(gè)資源網(wǎng)站(因?yàn)閁RL重寫服務(wù)器也需要占用一個(gè)Cookie來(lái)存放SessionID),這個(gè)數(shù)量基本夠用了。
(2)將Cookie存放在服務(wù)器端的Session中。
通過在URL重寫服務(wù)器端的Session中維護(hù)一個(gè)Cookie的HashMap,來(lái)管理這些目標(biāo)網(wǎng)站的Cook-ie信息。該HashMap提供與新接收到的Cookie合并的功能,同時(shí)能夠刪除過期的Cookie,更新同名的Cookie。
5.2電子資源中FTP全文下載的問題
如果電子資源中的全文是以FTP方式存放,就會(huì)遇到這個(gè)問題。解決方法:做一個(gè)FTP到HTTP的網(wǎng)關(guān),將FTP請(qǐng)求和回應(yīng)做封裝,在HTTP的頭中增加Content-Disposition頭,來(lái)指定文件名,把FTP文件數(shù)據(jù)放在HTTP回應(yīng)中。
5.3對(duì)于非HTTP的通訊協(xié)議資源的解決方法
極少數(shù)資源使用了單獨(dú)的客戶端以及自定義的非HTTP的通訊協(xié)議,不能通過URL重寫技術(shù)實(shí)現(xiàn)。我們通過開發(fā)客戶端插件,并在重寫服務(wù)程序里增加一個(gè)SOCKS代理模塊來(lái)實(shí)現(xiàn)??蛻舳瞬寮捎肁PIHOOK技術(shù),接管這些非HTTP協(xié)議的客戶端的所有網(wǎng)絡(luò)SOCKET調(diào)用,將目標(biāo)地址轉(zhuǎn)向到重寫服務(wù)器的SOCKS服務(wù)器。但是要求讀者在訪問該資源的時(shí)候,必須安裝客戶端插件。
6、山東大學(xué)圖書館的系統(tǒng)部署
山東大學(xué)目前已經(jīng)將30多種資源通過URL重寫服務(wù)器,向讀者提供服務(wù)。IBM X346服務(wù)器作為認(rèn)證服務(wù)器和主URL重寫代理服務(wù)器。均衡的重寫代理服務(wù)器配置安裝在部分資源服務(wù)器上,做為流量的分流。圖書館內(nèi)鏡像的Web資源,將其原始地址通過防火墻隱藏,向讀者發(fā)布的是重寫后的URL地址。當(dāng)用戶訪問的資源未經(jīng)過認(rèn)證,會(huì)彈出認(rèn)證頁(yè)面進(jìn)行認(rèn)證;如果已經(jīng)認(rèn)證過,那么訪問該資源就和訪問原始的資源效果完全一樣。
用戶分為登錄用戶和IP機(jī)構(gòu)用戶兩種。登錄用戶賬號(hào)提供給讀者在校外訪問。IP機(jī)構(gòu)用戶是指讀者在校園網(wǎng)內(nèi)訪問該系統(tǒng),只要讀者的IP地址在校園網(wǎng)IP范圍內(nèi),則系統(tǒng)自動(dòng)影射為與該IP對(duì)應(yīng)的某個(gè)機(jī)構(gòu)用戶賬號(hào)上,比如某教研室的賬號(hào)。
7、結(jié)束語(yǔ)
該系統(tǒng)經(jīng)過近兩年的穩(wěn)定運(yùn)行,得到了廣大讀者的好評(píng),已經(jīng)成為教師訪問圖書館資源的主要方式之一。并且和CALLS統(tǒng)一認(rèn)證做了接口,提供本地和CALIS統(tǒng)一認(rèn)證兩種登錄方式。
2008年年初,山東大學(xué)圖書館還申請(qǐng)了一條網(wǎng)通的100M數(shù)據(jù)專線來(lái)為校外提供更好的服務(wù)。系統(tǒng)支持教育網(wǎng)和網(wǎng)通兩條網(wǎng)絡(luò)接口,并實(shí)現(xiàn)統(tǒng)一認(rèn)證。
為了更好地服務(wù)讀者,該系統(tǒng)將會(huì)繼續(xù)完善和發(fā)展,將其應(yīng)用擴(kuò)展到非HTTP應(yīng)用上,增強(qiáng)客戶端插件的功能,使讀者可以通過該系統(tǒng)訪問更多的資源。