- JSP應用與開發技術(第3版)
- 馬建紅 李學相 韓穎 王瑞娟 張晗
- 1981字
- 2020-06-30 17:13:27
5.3 Cookie對象的應用實例
前面介紹了JSP讀寫Cookie信息的基礎知識,但是還沒有涉及具體的應用,下面通過兩個具體的實例來幫助讀者進一步學習。
【例5-1】在JSP中使用Cookie。該實例有writeCookie.jsp和readCookie.jsp兩文件。其中writeCookie.jsp用于寫入Cookie,readCookie.jsp用于讀取Cookie。
writeCookie.jsp寫一個Cookie到客戶端,代碼如下:

執行結果如圖5-2所示。

圖5-2 writeCookie.jsp的執行結果
readCookie.jsp代碼如下:

readCookie.jsp必須注意兩個問題:一是讀入Cookie數組時需要判斷是否為null,如果為空就不能進行下一步的操作,只能顯示出Cookie為空的錯誤信息;二是對Cookie數組的長度進行判斷,如果Cookie.length==0,說明該客戶端瀏覽器不支持Cookie。
在寫完Cookie的10分鐘之內,readCookie.jsp頁面的執行結果如圖5-3所示。超過10分鐘,該Cookie就會被瀏覽器刪除。

圖5-3 readCookie.jsp的執行結果
如果沒有執行writeCookie.jsp,而直接執行readCookie.jsp,那么將顯示“沒有Cookie”字樣,如圖5-4所示。

圖5-4 直接執行readCookie.jsp的結果
【例5-2】Cookie的作用是在客戶端保存用戶的信息,供用戶下一次訪問服務器的程序時使用。本例由包括個程序,CookieJSP.jsp創建并保存Cookie,ShowCookie.jsp取得客戶端所有Cookie信息,并在頁面上顯示。
CookieJSP.jsp代碼如下:

注意:如果不設置Cookie的保存時間,Cookie不會保存在硬盤內。
ShowCookie.jsp的代碼如下所示:

CookieJSP.jsp的運行結果如圖5-5所示。

圖5-5 CookieJSP.jsp的運行結果
單擊“顯示Cookie值”鏈接,執行結果如圖5-6所示。

圖5-6 ShowCookie.jsp的執行結果
在地址欄中輸入http://localhost:8080/ch05/CookieJSP.jsp?name=tom,然后單擊“顯示Cookie值”鏈接,執行結果如圖5-7所示。

圖5-7 輸入name后ShowCookie.jsp的執行結果
打開另一個瀏覽器,直接輸入http://localhost:8080/ch05/ShowCookie.jsp地址訪問Cookie的值,如圖5-8所示。

圖5-8 直接運行ShowCookie.jsp的執行結果
刷新http://localhost:8080/ch05/ShowCookie.jsp頁面,結果如圖5-9所示。

圖5-9 刷新ShowCookie.jsp的執行結果
從上述執行結果可見,同一臺機器的不同客戶端訪問都可以訪問服務器保存在本地機器的Cookie。新開啟的頁面中未保存JSESSIONID的信息。
JSESSIONID就是客戶端用來保存sessionid的變量,一般對于Web應用來說,客戶端變量都會保存在Cookie中,JSESSIONID也不例外。不過與一般的Cookie變量不同,JSESSIONID是保存在內存Cookie中的,在一般的Cookie文件中是看不到。內存Cookie在打開一個瀏覽器窗口的時候會創建,在關閉這個瀏覽器窗口的時候也同時銷毀。這也就解釋了為什么session變量不能跨窗口使用,要跨窗口使用就需要手動把JSESSIONID保存到Cookie里面。
只有通過JSESSIONID才能使session機制起作用,而JSESSIONID又是通過Cookie來保存的。如果用戶禁用了Cookie,可以通過URL重寫來實現JSESSIONID的傳遞。JESSIONID通過這樣的方式從客戶端傳遞到服務器端,從而標識session。這樣在用戶禁用Cookie的時候也可以傳遞JSESSIONID來使用session,只不過需要每次都把JSESSIONID作為參數跟在URL后面傳遞。這樣很麻煩,每次請求一個URL都要判斷Cookie是否可用,如果禁用了Cookie,還要從URL里解析出JSESSIONID,然后跟在處理完后轉到的URL后面,以保持JSESSIONID的傳遞。這些問題Sun已經想到了,所以提供了兩個方法來使事情變得簡單:response.encodeURL()和response.encodeRedirectURL()。這兩個方法會判斷Cookie是否可用,如果禁用了會解析出URL中的JSESSIONID,并連接到指定的URL后面,如果沒有找到JSESSIONID會自動生成一個。這兩個方法在判斷是否要包含JSESSIONID的邏輯上會稍有不同。在調用response.sendRedirect之前,應該先調用response.encodeURL()或encodeRedirectURL()方法,否則可能會丟失sesssion信息。
【例5-3】服務器使用URL重寫。jsessionid1.jsp利用了response對象內的encodeURL方法,將URL做了一個編碼動作。jsessionid2.jsp顯示sessionID。
jsessionid1.jsp代碼如下:

jsessionid2.jsp代碼如下:

如果Cookie沒有禁用,在瀏覽器地址欄中看到的地址是這樣的:http://localhost:8080/ch05/jsessionid2.jsp;如果禁用了Cookie,則看到:http://localhost:8080/ch05/jsessionid2.jsp;jsessionid=989A54B6B8DAD17453C36C79C32748EE,如圖5-10所示。

圖5-10 禁用Cookie時jsessionid1.jsp的執行結果
注意,JSESSIONID跟一般的URL參數傳遞方式是不同的,不是作為參數跟在“?”后面,而是緊跟在URl后面用“;”來分隔。
【例5-4】應用Cookie保留用戶提交的信息。這個例子包含3個文件,usingCookie.html文件是一個HTML表單,其中布置了幾種可供用戶選取及輸入個人數據的表單選項。usingCookie.jsp網頁取得上述表單傳送過來的變量數據,并將這些數據存入Cookie當中,然后將網頁定向responseCookie.jsp。responseCookie.jsp網頁程序會取得稍早存儲在Cookie中的用戶數據,并加以變化輸出至瀏覽器。
usingCookie.html代碼如下:

usingCookie.jsp代碼如下:

responseCookie.jsp代碼如下:

查看usingCookie.html網頁,在表單中輸入所需資料信息,單擊“發送資料”按鈕,如圖5-11所示。在表單中輸入的數據被存儲至Cookie當中,接下來轉至responseCookie.jsp,將Cookie數據取出并在瀏覽器中顯示,如圖5-12所示。

圖5-11 提交用戶信息

圖5-12 應用Cookie保存用戶信息
在第4章學習了session對象,通常采用session對象來保存用戶的信息,可以在多個頁面之間跳轉時保持有效,而此例采用Cookie對象來保存用戶的信息。usingCookie.jsp把用戶信息存入Cookie當中,responseCookie.jsp讀取Cookie中的用戶數據,可以得到和session對象同樣的效果。
另外,可以在usingCookie.jsp中使用setMaxAge()方法設置Cookie對象的存在期限。這樣Cookie對象就會保存在硬盤中的Cookies文件夾中,用戶可以不用從usingCookie.html登錄,直接打開responseCookie.jsp就可以讀取Cookie中的用戶數據。不論瀏覽器是否關閉,或者服務器是否重啟,只要該文件還存在,就會一直保留用戶的信息。Cookie和session的關系以及Cookies和session有什么本質區別請大家查閱相關資料,這里不再詳述。
在此例中還存在一個問題,就是如果輸入的用戶名是中文的話會出現亂碼,雖然在第6章有解決中文亂碼的方法,但是在這里并不適用。若想解決亂碼問題,可以采用如下方法。
使用java.net.URLEncoder.encode()對要傳遞的中文進行編碼,在傳參數之前先把參數進行轉碼,java.net.URLEncoder.encode(param);取值時用語句java.net.URLDecoder.decode(param);再轉回中文。
把usingCookie.jsp中創建Cookie的代碼
Cookie nameCookie = new Cookie("name", strname);
改為:
Cookie nameCookie = new Cookie("name", java.net.URLEncoder.encode(strname));
把responseCookie.jsp中顯示用戶名的代碼
<font color="<%=color%>" size="5"><%=name%></font>
改為:
<font color="<%=color%>" size="5"><%=java.net.URLDecoder.decode(name)%></font>
即可解決中文亂碼問題。
- MATLAB圖像處理超級學習手冊
- 編程卓越之道(卷3):軟件工程化
- Magento 2 Theme Design(Second Edition)
- Ray分布式機器學習:利用Ray進行大模型的數據處理、訓練、推理和部署
- Lua程序設計(第4版)
- Hands-On Functional Programming with TypeScript
- Windows Phone 7.5:Building Location-aware Applications
- Building Wireless Sensor Networks Using Arduino
- Android群英傳
- Fast Data Processing with Spark(Second Edition)
- Swift語言實戰晉級
- 創意UI Photoshop玩轉移動UI設計
- Mastering Android Studio 3
- Instant GLEW
- Java EE項目應用開發