摘要:session對象用來存儲有關(guān)用戶會話的所有信息。在使用JSP實現(xiàn)頁面的訪問控制過程中,訪問控制流程是基于session對象所提供的兩個方法setAttribute和getAttribute來完成的。最后,通過列舉典型實例,說明訪問控制流程的具體實現(xiàn)過程。
關(guān)鍵詞:動態(tài)網(wǎng)頁;JSP;訪問控制;session
中圖分類號:TP311文獻標(biāo)識碼:A文章編號:1009-3044(2009)35-10001-02
Using JSP to Realize the Process of Access Control in Dynamic Page
HUANG Zhi-yan
(Dept. of Computer Engineering, Jiangsu Vocational and Technical College of Finance Economics, Huai'an 223003, China)
Abstract: The object session is used to store all information about user's conversation. The access control is realized by two method setAttribute and getAttribute supplied by session object in JSP. Finally, the detail process of access control is showed by example.
Key words: dynamic page; JSP; access contron; session
在網(wǎng)上沖浪的過程中,大家一定有過這樣的經(jīng)歷:好不容易找到了一本期盼已久的電子書的下載網(wǎng)址,可是在單擊下載時,系統(tǒng)會自動轉(zhuǎn)入登錄頁面,提示用戶登錄網(wǎng)站。當(dāng)然,如果是已登錄用戶,就不會面臨這樣的問題了。那么,系統(tǒng)是如何用戶是否已經(jīng)登錄過該網(wǎng)站呢?換句話說,系統(tǒng)如何實現(xiàn)對頁面的訪問控制的呢?
如圖1和圖2所示是系統(tǒng)進行訪問控制的兩種情形[1]。在圖1中,用戶通過登錄頁面登錄網(wǎng)站,如果該用戶是已注冊用戶,系統(tǒng)會保存該用戶的登錄信息,并讓用戶進入其欲訪問的頁面。在圖2中,用戶直接訪問網(wǎng)站的某個頁面,系統(tǒng)會去查詢是否保存有該用戶的登錄登錄信息,如果有,則顯示該頁面的內(nèi)容,如果沒有,就轉(zhuǎn)入登錄頁面,要求用戶登錄網(wǎng)站。
圖1 訪問控制流程圖2 訪問控制流程
這個流程是容易理解的,問題在于,系統(tǒng)如何保存不同用戶的登錄信息呢?JSP為我們提供了一套會話跟蹤機制,該機制可以維持每個用戶的會話信息,也就是說,使用會話跟蹤,可以為不同的用戶保存不同的數(shù)據(jù)。
1 什么是會話
就Web開發(fā)來說,一個會話就是用戶通過瀏覽器與服務(wù)器之間進行一次通話,它包含瀏覽器與服務(wù)器之間的多次請求、響應(yīng)過程[2]。
如圖3所示描述了瀏覽器與服務(wù)器的一次會話過程。當(dāng)用戶向服務(wù)器發(fā)出第一次請求時,服務(wù)器會為該用戶創(chuàng)建唯一的會話,會話將一直延續(xù)到用戶訪問結(jié)束(瀏覽器關(guān)閉,本次會話結(jié)束)。
JSP提供了一個可以在多個請求之間持續(xù)有效的會話對象session,session對象允許用戶存儲和提取會話狀態(tài)的信息。
2 JSP內(nèi)置對象session
在JSP中,提供了一個內(nèi)置對象session,session對象用來存儲有關(guān)用戶會話的所有信息。Session對象的常用方法如下:
1)void setAttribute(String key, Object value):以鍵-值對的方式,將一個對象的值存放到session中去。例如:setAttribute(\"name\",\"admin\"),就是把字符串a(chǎn)dmin存放到session中去,它對應(yīng)的鍵是name。
2)Object getAttribute(String key):根據(jù)鍵去獲取session中存放的對象的值。例如:String name = (String) session.getAttribute(\"name\"),就是通過名稱為name的鍵獲取session中存放的對象的值。
在JSP中,訪問控制就是基于session對象來完成的,接下來,舉例說明使用JSP內(nèi)置對象session實現(xiàn)訪問控制。
3 舉例
實現(xiàn)頁面的登錄功能,要求系統(tǒng)提供用戶登錄頁面,所有用戶必須登錄之后,才能訪問主頁面。訪問控制流程見圖3所示。
根據(jù)系統(tǒng)的訪問控制控制流程,至少要完成如下幾個步驟:
1)創(chuàng)建數(shù)據(jù)庫db,在其中創(chuàng)建表userinfo,負責(zé)存儲用戶名、密碼。
2)創(chuàng)建類(User.java),負責(zé)存儲登錄用戶的信息,如:用戶名、密碼。
3)創(chuàng)建登錄頁面(login.html)。
4)創(chuàng)建登錄處理頁面(login.jsp)。
5)在主頁面中加入登錄驗證。
首先,在db數(shù)據(jù)庫中創(chuàng)建表userinfo,表結(jié)構(gòu)見表1所示。
接下來,創(chuàng)建類User.java,用來存儲已登錄的用戶名和密碼,代碼實現(xiàn)如下:
public class User {
private String name; // 用戶名
private String password; // 密碼
public User(String name, String password) {
this.name = name;
this.password = password;}
public String getName() {
return name;}
public String getPassword() {
return password;}
public void setName(String name) {
this.name = name;}
public void setPassword(String password) {
this.password = password;}
}
然后編寫登錄頁面,接下來的環(huán)節(jié)比較關(guān)鍵,要在登錄頁面中進行一系列的邏輯處理:首先查詢數(shù)據(jù)庫判斷該用戶是否已注冊,接著在session中保存已登錄用戶的信息,其關(guān)鍵代碼如下:
<%
if (rs.next()) { //如果是已注冊用戶
//把用戶名、密碼封裝在User對象中
User loginedUser = new User(name, pass); session.setAttribute(\"LOGINED_USER\", loginedUser);
response.sendRedirect(\"index.jsp\");
} else {
response.sendRedirect(\"login.html\");
}
%>
現(xiàn)在進行最后一步,在主頁面中加入登錄驗證。此時要完成的任務(wù)是:從session中提取用戶的信息,如果用戶信息存在,顯示首頁內(nèi)容;如果用戶信息不存在,跳轉(zhuǎn)到登錄頁面,關(guān)鍵代碼如下:
<%
User user = (User) session.getAttribute(\"LOGINED_USER\");
if (user == 1) {
response.sendRedirect(“l(fā)ogin.html\");
}
%>
到此為止,該系統(tǒng)的訪問控制已經(jīng)基本實現(xiàn)了。驗證一下訪問控制的效果具體步驟分為如下幾步:
1)直接在瀏覽器地址欄中輸入URL,訪問系統(tǒng)首頁面。
2)通過登錄頁面進入系統(tǒng)首頁面。
3)重新開啟一個瀏覽器窗口,直接訪問系統(tǒng)首頁面。
如果直接在瀏覽器欄中輸入URL,訪問系統(tǒng)首頁面,那么系統(tǒng)會跳入登錄頁面,提示用戶進行登錄。如果通過登錄頁面進入系統(tǒng)首頁面,那么只要是已注冊用戶,都可以正常進入。如果重新開啟一個瀏覽器窗口,直接訪問系統(tǒng)首頁面,那么不管在其他窗口中是否登錄,進入的肯定是登錄頁面。這是因為每個session對象都與瀏覽器一一對應(yīng),也就在于說,重新開啟一個瀏覽器窗口,相當(dāng)于重建一個session對象,在其他瀏覽器窗口保存的登錄信息與新的瀏覽器窗口完全無關(guān),所以系統(tǒng)會判斷該用戶尚未登錄,必定跳轉(zhuǎn)進入登錄頁面。
4 結(jié)束語
本文介紹了動態(tài)頁面中常見的兩種訪問控制流程,以及使用session對象中的setAttribute和getAttribute兩個方法實現(xiàn)動態(tài)網(wǎng)頁中的訪問控制問題,并通過實例詳細描述了實現(xiàn)過程。
參考文獻:
[1] 聶哲. JSP動態(tài)Web技術(shù)實例教程[M].北京:高等教育出版社,2009.
[2] 北京阿博泰克北大青鳥信息技術(shù)有限公司.使用JSP開發(fā)Web應(yīng)用系統(tǒng)[Z].2008.