完整版JSP頁面的訪問控制_第1頁
完整版JSP頁面的訪問控制_第2頁
完整版JSP頁面的訪問控制_第3頁
完整版JSP頁面的訪問控制_第4頁
完整版JSP頁面的訪問控制_第5頁
已閱讀5頁,還剩17頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、JSP頁面的訪問控制1.1訪問控制1.1.1如何實現訪問控制1.1中,用戶通過登錄如圖1.1和圖1.2所示是系統進行訪問控制的兩種情形。在圖頁面登錄網站,如果該用戶是已注冊用戶,系統會保存該用戶的登錄信息,并讓用戶進入其欲訪問的頁面。在圖1.2中,用戶直接訪問網站的某個頁面,系統會去查詢是否保存有該用戶的登錄信息,如果有,則顯示該頁面的內容,如果沒有,就轉入登錄頁面,要求用戶登錄網站。J進入欲訪問的頁面圖1.2訪問控制流程(2)圖1.1訪問控制流程(1)JSP為提供了一套會話跟蹤機制,該機制可以維持每個用戶的會話信息。也就是說,使用會話跟蹤,可以為不同的用戶保存不同的數據。1.1.2什么是會話

2、就 Web開發來說,一個會話就是用戶通過瀏覽器與服務器之間進行的一次通話,它包含瀏覽器與服務器之間的多次請求、響應過程。如圖1.3所示描述了瀏覽器與服務器的一次會話過程。當用戶向服務器發岀第一次請求時,服務器會為該用戶創建唯一的會話,會話將一直延續到用戶訪問結束(瀏覽器關閉,本次會話結束)As瀏覽器瀏覽器響應1請求2n-4響應2n請求1圖1.3一次會話過程session , session對象允許用戶存儲和提取會話狀態的信息。接下來,就來學習JSP內置對象 session。1.1.3 JSP 內置對象 session在JSP中,提供了一個內置對象session,session對象用來存儲有關用

3、戶會話的所有信息。session對象的常用方法如下:void setAttnbute(Stn ng key,Object value):以鍵/值的方式,將一個對象的值存放到JSP提供了一個可以在多個請求之間持續有效的會話對象3 / 19session中去。例如:name。session.setAttributeCname, admin);就是把字符串 admin存放到session中去,它對應的鍵是Object getAttribute(Stri ng key):根據鍵去獲取session中存放的對象的值。例如:String name = (String) session.getAttribu

4、te(name);就是通過名稱為name的鍵獲取 session中存放的對象的值。在JSP中,訪問控制就是基于session對象來完成的,接下來,就使用JSP內置對象session為新聞發布系統增加訪問控制。1.1.4為新聞發布系統增加訪問控制1.4所示。現在升級新聞發布系統,增加訪問控制功能,要求系統提供用戶登錄頁面,所有用戶必須登錄之后,才能訪問新聞發布系統。訪問控制流程如圖I壬用戶a豪-laj xj-11 -1 ; 1Loe .二J a 如文件tn輻收 ItSG ”:寸收碎回ffl戶蘭爭1A.用戶*d罡 iM:|査錄1住|1-Jj呂 豐tiL IhUfUitl1血- dsessi on

5、中無法提取到用戶信息登錄處理頁面(login.js P)21. 獲得登錄信息2. 查詢數據庫,判斷該用戶是否注冊3. 如果該用戶已注冊,在session中保 存該用戶的登錄信息,并且跳轉到新聞 發布系統的首頁面用戶已注冊31新聞發布系統首頁面(in dex.js p)1. 從session中提取該用戶信息2. 如果用戶信息存在,顯示首頁內容3. 如果用戶信息不存在,跳轉到登錄頁面圖1.4 新聞發布系統的訪問控制流程根據新聞發布系統的訪問控制流程,至少要完成如下幾個步驟。在news數據庫中創建表userinfo,負責存儲用戶名、密碼。(2)創建類(User.java),負責存儲登錄用戶的信息,如

6、用戶名、密碼。創建登錄頁面(login.html )。(4)創建登錄處理頁面(login.jsp )。在新聞發布系統首頁面中加入登錄驗證。F面,就逐步完成這項升級任務。首先,在news數據庫中創建表userinfo,表結構見表1.1。表1.1 數據表 userinfo字段名稱字段說明數據類型大小loginName用戶名稱varchar50P assword密碼varchar50接下來,創建類User.java,用來存儲已登錄用戶的用戶名和密碼,代碼實現如示例所示。P ackage s2.java.web.sg1.entity;p ublic class User p rivate String

7、 name;/用戶名/密碼p rivate String p assword;/* 構造函數* param name 用戶名* param password 密碼*/public User(String name, String password) = name;this.password = password;/* 返回用戶名*/public String getName() return name;/* 返回密碼*/public String getPassword() return password;/* 設定用戶名* param name*/public void

8、setName(String name) = name;/* 設定密碼* param password */public void setPassword(String password) this.password = password;2 所示。登錄頁面 login.html 非常容易編寫,代碼實現如示例示例2vhtml vtitle 用戶登錄 v/title vscri pt language =JavaScn pt function loginSubmit()if(form1.loginName.value =null | form1.loginName.value

9、=)alert(請填寫用戶名r);return false;if(form1. password.value =null | forml. password.value=) alert(請填寫密碼!);return false;return true;v/scri pt v/head vbodyvform method=P OST name=form1 action=login.js p 用戶名:vinput type=text name=loginName size=20密   碼:vinput type=password name=password size=20vp align

10、=leftvinput typ e=submit valued 錄name=submit onclick=return loginSubmit();vinput type=reset value= 重置name=resetv/p v/form v/body v/html3所示。要在登錄處理頁面中進行一系列的邏輯處理:首先查詢數據庫判斷該用戶是否已注 冊,接著在 session中保存已登錄用戶的信息,代碼實現如示例示例3v%p age language=java contentT yp e=text/html;charset=GBK% v% p age imp ort=java.sql.*%v%

11、 p age imp ort=s2.java.web.sg1.ConnectionManager% v% p age imp ort=s2.java.web.sg1.entity.User%session 中提取用在新聞發布系統首頁面中加入登錄驗證。此時要完成的任務是:從 戶的信息,如果用戶信息存在,顯示首頁內容;如果用戶信息不存在,跳轉到登錄頁 面。已經完成了圖 1.1 所示的訪問控制流程。但是如果此時用戶直接在瀏覽器地址欄中輸7 / 19入新聞發布系統首頁面的地址,還是能夠不受登錄限制而訪問成功的。接下來要完成4 所示。的就是圖 1.2 所示的訪問控制流程。具體代碼實現如示例示例4v% P

12、 age language=java contentT yp e=text/html; charset=GBK% vhtml vheadvtitle 新聞發布系統 v/titlev/head vFRAMESET rows=20%,80% cols=*vFRAME src=t op.jsp name=t op Frame scrolling=NO marginwidth=0 marginheight=0vFRAMESET rows=* cols=25%,75%vFRAME src=left.js p name=leftFrame scrolling=yes marginwidth=0margin

13、height=0vFRAME src=welcome.js p name=mainFrame scrolling=yes marginwidth=0 marginheight=0v/FRAMESET v/FRAMESET vnoframesv/noframes v/html還需要驗證一下訪問控制的效至此為止, 新聞發布系統的訪問控制已經基本實現了。果,具體步驟可分為如下幾步。直接在瀏覽器地址欄中輸入URL,訪問系統首頁面。(2)通過登錄頁面進入系統首頁面。21 / 19重新開啟一個瀏覽器窗口,直接訪問系統首頁面。按照上述步驟運行一下,看看每個步驟會發生什么樣的結果,并思考一下為什么會產生這樣的

14、結果?,F在,來分析一下。如果直接在瀏覽器地址欄中輸入URL ,訪問系統首頁面,那么系統會跳入登錄頁面,提示用戶進行登錄。這個原因很簡單,因為在系統首頁面中加入了登錄驗證。如果通過登錄頁面進入系統首頁面,那么只要是已注冊用戶,都可以正常進入。這個可以通過登錄處理頁面的代碼(示例3)得到解釋。如果重新開啟一個瀏覽器窗口,直接訪問系統首頁面,那么不管你在其他窗口中是否登錄,你進入的肯定是登錄頁面。這是因為:每個session對象都與瀏覽器對應,也就是說,重新開啟一個瀏覽器窗口,相當于重新創建一個session對象,在其他瀏覽器窗口保存的登錄信息與新的瀏覽器窗口完全無關,所以系統會判定尚未登錄,定跳轉

15、進入登錄頁面。1.1.5 in elude 指令在新聞發布系統中,除了首頁面,還有許多二級頁面,同樣要求只有登錄用戶才能夠訪問。那么現在就有一個問題需要解決,看下面的問題:如果要為多個頁面添加登錄驗證,有沒有辦法避免重復代碼的岀現?JSP為提供了文件引用指令in elude??梢詫⒁恍┕残缘膬热輰懭胍粋€單獨的文件中,然后通過in elude指令引用該文件,從而緩解代碼的冗余問題,并且修改起來也更加方便,即對這些共性內容只需要修改那個獨立的文件即可。首先,需要創建登錄驗證文件eheeklogin.jsp ,代碼實現如示例5所示。示例5v% p age imp ort=s2.java.web.sg

16、1.entity.User%v%User user = (User) session.getAttribute(LOGINED_USER); if (user = null) respo nse.sendRedirect(login.html);%示例5的代碼與示例4中進行登錄驗證的那部分代碼一模一樣。有了這個獨立的文代碼實現如示例件,只需在系統首頁面和其他二級頁面中引用該文件就可以了,示。示例6v% p age language=java contentT yp e=text/html; charset=GBK% v% p age imp ort=s2.java.web.sg1.entity

17、.User%vhtmlvheadvtitle新聞發布系統 v/titlev/headv% include file=eheeklogin.js p%vFRAMESET rows=20%,80% cols=*vFRAME src=t op.jsp name=t op Frame scrolling=NO marginwidth=0 marginheight=0 marginheight=0FRAME src=left.js p name=leftFrame scrolling=yes marginwidth=0 1.2已訪問人數統計1.2.1為新聞發布系統增加已訪問人數統計功能升級新聞發布系統,

18、增加已訪問人數統計功能,具體要求如下。左導航頁面中增加一個超鏈接已訪問人數統計”,單擊該超鏈接后,進入已訪問人數1.5所示。統計頁面,該頁面顯示已訪問人數,以及訪問者的登錄名稱,如圖-Ja|2sJT忡舊 帥i收甫*(ii la Qii W=Jiriti圖1.5已訪問人數統計頁面為了實現這一功能,需要完成以下工作。創建登錄頁面(login2.html )。(2)創建登錄處理頁面(login2.jsp ),把已登錄用戶的信息保存在一個全局范圍內。在左導航頁面( left.jsp )中加入超鏈接,鏈接至已訪問人數統計頁面。(4)創建已訪問人數統計頁面(showAIILogi nedUsers.js

19、p),把已登錄用戶的信息從全局范圍內取岀來。F面,就逐步完成這項升級任務。首先,創建登錄頁面log in 2.html,這個登錄頁面與示例2中的log in .html非常相似,只需把form表單的提交地點改為log in 2.js p 就可以了。接著,進入一個關鍵的環節,創建登錄處理頁面login2.jsp。代碼實現如示例7所示。示例7v%p age language=java contentT yp e=text/html;charset=GBK% 示例7同樣實現了訪問控制功能,除此之外,示例7的粗體部分則是為了實現已訪問該集合在全局范圍內有效。其中使用到了一個JSP內置對象 applic

20、ation,它類似于系統的人數統計的功能,這段代碼的主要用途是把已登錄用戶的信息存入一個集合中,全局變量,用于實現用戶之間的數據共享。稍后將詳細介紹這個內置對象,此處了解其基本用途就可以了。接下來的工作較為簡單,就是在左導航頁面(left.jsP )中加入超鏈接,鏈接至已訪問人數統計頁面,代碼實現如示例8所示。示例8 vHTML 新聞發布后臺管理 v/h3 vp class=text-1 一級標題發布 v/avbrva href=createLevelTwoTitle.jsp target=mainFrame 二級標題及文件位置發布v/a vbrvbr va href=showAIILogin

21、edUsers.jsp target=mainFrame 已訪問人數統計 v/a v/BODY v/HTML最后,要創建已訪問人數統計頁面(showAllLoginedUsers.jsp ),把已登錄用戶的信息從全局范圍內取岀來,并逐行顯示,頁面效果如圖1.5所示。代碼實現如示例示。示例9v% p age imp ort=s2.java.web.sg1.entity.User%v% p age imp ort=java.util.*%vhtml vp align=center目前,有v%=loginedUsers.size()%人已經訪問過本網站!vbrvbr訪問者的登錄名稱分別是:vbr);

22、 % 還需要驗證一下已至此為止,新聞發布系統的已訪問人數統計功能已經完整實現了。訪問人數統計的效果,具體步驟可分為如下幾步。(1 )通過登錄頁面進入系統首頁面,查看已訪問人數統計。(2)重新開啟一個瀏覽器窗口,使用不同的用戶登錄進入首頁面,查看已訪問人數統計。按照上述步驟運行一下,看看每個步驟會發生什么樣的結果,并思考一下為什么會產生這樣的結果。現在,來分析一下。如果用戶通過登錄頁面進入系統,那么登錄處理頁面會將該用戶信息存放入訪問者列表中,此時已訪問人數一定會在原有基礎上自動加1,并在頁面上顯示岀該用戶的信息。如果重新開啟一個瀏覽器窗口,使用不同的用戶登錄進入首頁面,那么已訪問人數依然會在原

23、有基礎上自動加1,并在頁面上顯示岀這個用戶的信息。這是因為:所有的已訪問用戶的信息都存放在全局范圍內,與瀏覽器窗口無關,這一點一定要同session區分開來。1.2.2 JSP內置對象 application前面已經提到過,application是一個JSP的內置對象,它類似于系統的全局變量,用于實現用戶之間的數據共享。appl icati on對象的常用方法如下所示。void setAttnbute(Stn ng key,Object value):以鍵/值的方式,將一個對象的值存放到application中。例如,application.setAttribute(LOGINED_USER,

24、 new ArrayList();就是把一個 ArrayList對象存放到application中去,它對應的鍵是LOGINED USERObject getAttribute(Stri ng key):根據鍵去獲取application中存放對象的值。例如,如下代碼段就是通過名稱為LOGINED_USER的鍵獲取 appl icatio n 中存放的對象的值。if (app lication.getAttribute(LOGINED_USER) != null) List loginedUsers = (List) appl ication.getAttribute(LOGINED_USER

25、);至此,JSP的幾個常用的內置對象都已經介紹給了。下面通過表1.2對這些內置對象進行一下簡要的總結。表1.2 JSP的常用內置對象內置對象名稱說明out對象用于向客戶端輸出數據request 對象主要用于客戶端的請求處理response 對象用于響應客戶請求并向客戶端輸出信息session 對象用來存儲有關用戶會話的所有信息application 對象類似于系統的全局變量,用于實現用戶之間的數據共享1.3分級瀏覽提供給一般用戶瀏覽各級新新聞發布系統的分級瀏覽屬于新聞發布系統的前端頁面,聞。接下來,就一起實現新聞的分級瀏覽功能。1.3.1創建前臺首頁面新聞分級瀏覽功能的頁面效果如圖1.6所示,

26、具體要求如下。丄口J兇T I匡7 IgJt訥90如/裁卅疋鞏T 遂.* 耳艾*世 蒯聲 H(v)吃黑具rfirt) 耐世)&新聞發率熹統鞭圖1.6新聞發布系統的分級瀏覽在新聞發布系統的前臺首頁面上,顯示所有新聞一級標題。為所有新聞一級標題設置超鏈接,單擊后,顯示下屬的所有新聞二級標題。具體做法可以分解為如下幾個步驟。使用表格把前臺首頁面分為三塊:上欄、左下欄、右下欄。(2)上欄顯示圖片。左下欄顯示新聞一級標題,提取到一個單獨的文件showFirstTitle.js p 中。(4)右下欄顯示新聞二級標題,提取到一個單獨的文件showSec on dTitle.js p中。(5)使用in elud

27、e指令引入這兩個文件。10所示。前臺首頁面(newspre.jsp )的代碼實現如示例示例 10v%p age language=java contentT yp e=text/html;charset=GBK%vhtmlvtitle新聞發布系統v/titlev/headvbodyvtable width=100%vtrvtd bgcolor=#FFFFFF height=86 vimg src=./images/head.gif border=0 width=100% alt= /v/tdv/trv/tablevtable width=100% bgcolor=#FFFFFFvtrvtd w

28、idth=150 valign=to p align=left bgcolor=#9999FFv%include file=showFirstTitle.js p %v/td vtd valign=to p height=100% width=859v%include file=showSecondTitle.js p %v/tdv/trv/tablev/body v/html1.3.2完成新聞發布系統的一級新聞瀏覽功能F面要完成的就是新聞一級標題的瀏覽功能。除了逐條逐行顯示新聞一級標題以外,還要為新聞一級標題設置超鏈接,并在超鏈接中傳遞參數:新聞一級標題的ID,以便單擊后能夠根據新聞一級標題

29、ID顯示下屬的所有新聞二級標題。創建新聞一級標題的瀏覽頁面(showFirstTitle.jsp ),代碼實現如示例11所示。示例11v%p age language=java contentT yp e=text/html;charset=GBK%v%page imp ort=s2.java.web.sg1.*%v%p age imp ort=java.util.List%vtablevtrvtd width=145 height=90 valign=to p align=left vimg src=images/left.j pg border=0 width=146 height=96

30、alt= / v/tdv/trvtrvtd height=461 width=145 valign=to p vdiv align=centervfont size=4 新聞分類 v/font v/divvbrv%/從數據庫中獲取所有新聞一級標題,并逐行顯示FirstLeveTitleDb Op reation first = new FirstLeveTitleDb Op reation();List list1 = first.getAIIFirstLevelTitleList();if (Iist1!=null & list1.size() != 0) for (int i = 0; i

31、 v list1.size(); i+) FirstLevelTitle fTitle = (FirstLevelTitle) list1.get(i);%vdiv align=centervahref=news pre.js p?p arentId=v%=fTitle.getId()% v%=fTitle.getTitleName()% v/a v/div vbrv%v/tdv/trv/table1.3.3完成新聞發布系統的二級新聞瀏覽功能在完成新聞二級標題的瀏覽功能之前,首先要在類Seco ndLevelTitleDb Op reation中添ID獲取下屬的新聞二級標題,加方法getSec

32、o ndByFirstO,用來根據新聞一級標題的代碼實現如示例12所示。示例 12P ackage s2.java.web.sg15;import java.sql.Connection;import java.sql. Prep aredStatement;import java.sql.ResultSet;import java.sql.SQLExce ption;import java.text.Si mpl eDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;p ublic

33、 class SecondLevelTitleDb Op reation /*根據新聞一級標題獲取下屬所有的新聞二級標題 * param int新聞一級標題的ID * return ArrayList新聞二級標題的集合 */P ublic List getSecondByFirst(int p arentTitleId) List list = new ArrayList();Connection dbConnection = null;Prep aredStatement p Statement = null;ResultSet res = null;try dbConnection = ConnectionManager.getConnection();String strSql = select * from SecondLevelTi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論