jsp cookie 處理
cookie 是存儲(chǔ)在客戶機(jī)的文本文件,它們保存了大量軌跡信息。在 servlet 技術(shù)基礎(chǔ)上,jsp 顯然能夠提供對(duì) http cookie 的支持。
通常有三個(gè)步驟來(lái)識(shí)別回頭客:
- 服務(wù)器腳本發(fā)送一系列 cookie 至瀏覽器。比如名字,年齡,id 號(hào)碼等等。
- 瀏覽器在本地機(jī)中存儲(chǔ)這些信息,以備不時(shí)之需。
- 當(dāng)下一次瀏覽器發(fā)送任何請(qǐng)求至服務(wù)器時(shí),它會(huì)同時(shí)將這些 cookie 信息發(fā)送給服務(wù)器,然后服務(wù)器使用這些信息來(lái)識(shí)別用戶或者干些其它事情。
本章節(jié)將會(huì)傳授您如何去設(shè)置或重設(shè) cookie 的方法,還有如何訪問(wèn)它們及如何刪除它們。
jsp cookie 處理需要對(duì)中文進(jìn)行編碼與解碼,方法如下:
string str = java.net.urlencoder.encode("中文", "utf-8"); //編碼 string str = java.net.urldecoder.decode("編碼后的字符串","utf-8"); // 解碼
cookie 剖析
cookie 通常在 http 信息頭中設(shè)置(雖然 javascript 能夠直接在瀏覽器中設(shè)置 cookie)。在 jsp 中,設(shè)置一個(gè) cookie 需要發(fā)送如下的信息頭給服務(wù)器:
http/1.1 200 ok date: fri, 04 feb 2015 21:03:38 gmt server: apache/1.3.9 (unix) php/4.0b3 set-cookie: name=yapf; expires=friday, 04-feb-17 22:03:38 gmt; path=/; domain=yapf.com connection: close content-type: text/html
正如您所見(jiàn),set-cookie 信息頭包含一個(gè)鍵值對(duì),一個(gè) gmt(格林尼治標(biāo)準(zhǔn))時(shí)間,一個(gè)路徑,一個(gè)域名。鍵值對(duì)會(huì)被編碼為url。有效期域是個(gè)指令,告訴瀏覽器在什么時(shí)候之后就可以清除這個(gè) cookie。
如果瀏覽器被配置成可存儲(chǔ) cookie,那么它將會(huì)保存這些信息直到過(guò)期。如果用戶訪問(wèn)的任何頁(yè)面匹配了 cookie 中的路徑和域名,那么瀏覽器將會(huì)重新將這個(gè) cookie 發(fā)回給服務(wù)器。瀏覽器端的信息頭長(zhǎng)得就像下面這樣:
get / http/1.0 connection: keep-alive user-agent: mozilla/4.6 (x11; i; linux 2.2.6-15apmac ppc) host: zink.demon.co.uk:1126 accept: image/gif, */* accept-encoding: gzip accept-language: en accept-charset: iso-8859-1,*,utf-8 cookie: name=xyz
jsp 腳本通過(guò) request 對(duì)象中的 getcookies() 方法來(lái)訪問(wèn)這些 cookie,這個(gè)方法會(huì)返回一個(gè) cookie 對(duì)象的數(shù)組。
servlet cookie 方法
下表列出了 cookie 對(duì)象中常用的方法:
序號(hào) | 方法 & 描述 |
---|---|
1 | public void setdomain(string pattern) 設(shè)置 cookie 的域名,比如 yapf.com |
2 | public string getdomain() 獲取 cookie 的域名,比如 yapf.com |
3 | public void setmaxage(int expiry) 設(shè)置 cookie 有效期,以秒為單位,默認(rèn)有效期為當(dāng)前session的存活時(shí)間 |
4 | public int getmaxage() 獲取 cookie 有效期,以秒為單位,默認(rèn)為-1 ,表明cookie會(huì)活到瀏覽器關(guān)閉為止 |
5 | public string getname() 返回 cookie 的名稱,名稱創(chuàng)建后將不能被修改 |
6 | public void setvalue(string newvalue) 設(shè)置 cookie 的值 |
7 | public string getvalue() 獲取cookie的值 |
8 | public void setpath(string uri) 設(shè)置 cookie 的路徑,默認(rèn)為當(dāng)前頁(yè)面目錄下的所有 url,還有此目錄下的所有子目錄 |
9 | public string getpath() 獲取 cookie 的路徑 |
10 | public void setsecure(boolean flag) 指明 cookie 是否要加密傳輸 |
11 | public void setcomment(string purpose) 設(shè)置注釋描述 cookie 的目的。當(dāng)瀏覽器將 cookie 展現(xiàn)給用戶時(shí),注釋將會(huì)變得非常有用 |
12 | public string getcomment() 返回描述 cookie 目的的注釋,若沒(méi)有則返回 null |
使用 jsp 設(shè)置 cookie
使用 jsp 設(shè)置 cookie 包含三個(gè)步驟:
(1)創(chuàng)建一個(gè) cookie 對(duì)象: 調(diào)用 cookie 的構(gòu)造函數(shù),使用一個(gè) cookie 名稱和值做參數(shù),它們都是字符串。
cookie cookie = new cookie("key","value");
請(qǐng)務(wù)必牢記,名稱和值中都不能包含空格或者如下的字符:
[ ] ( ) = , " / ? @ : ;
(2) 設(shè)置有效期:調(diào)用 setmaxage() 函數(shù)表明 cookie 在多長(zhǎng)時(shí)間(以秒為單位)內(nèi)有效。下面的操作將有效期設(shè)為了 24 小時(shí)。
cookie.setmaxage(60*60*24);
(3) 將 cookie 發(fā)送至 http 響應(yīng)頭中:調(diào)用 response.addcookie() 函數(shù)來(lái)向 http 響應(yīng)頭中添加 cookie。
response.addcookie(cookie);
實(shí)例演示
main.jsp 文件代碼如下所示:
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <%@ page import="java.net.*" %> <% // 編碼,解決中文亂碼 string str = urlencoder.encode(request.getparameter("name"),"utf-8"); // 設(shè)置 name 和 url cookie cookie name = new cookie("name", str); cookie url = new cookie("url", request.getparameter("url")); // 設(shè)置cookie過(guò)期時(shí)間為24小時(shí)。 name.setmaxage(60*60*24); url.setmaxage(60*60*24); // 在響應(yīng)頭部添加cookie response.addcookie( name ); response.addcookie( url ); %> <html> <head> <title>設(shè)置 cookie</title> </head> <body> <h1>設(shè)置 cookie</h1> <ul> <li><p><b>網(wǎng)站名:</b> <%= request.getparameter("name")%> </p></li> <li><p><b>網(wǎng)址:</b> <%= request.getparameter("url")%> </p></li> </ul> </body> </html>
以下是一個(gè)簡(jiǎn)單的 html 表單通過(guò) get 方法將客戶端數(shù)據(jù)提交到 main.jsp 文件中,并設(shè)置 cookie:
<!doctype html> <html> <head> <meta charset="utf-8"> <title>碩編程(yapf.com)</title> </head> <body> <form action="main.jsp" method=get> 站點(diǎn)名: <input type="text" name="name"> <br /> 網(wǎng)址: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html>
將以上 html 代碼保存到 test.htm 文件中。
將該文件放置于當(dāng)前 jsp 項(xiàng)目的 webcontent 目錄下(與 main.jsp 同一個(gè)目錄)。
通過(guò)訪問(wèn) http://localhost:8080/testjsp/test.html 提交表單數(shù)據(jù)到 main.jsp 文件,演示 gif 圖如下所示:
試著輸入 "站點(diǎn)名" 和 "網(wǎng)址",然后點(diǎn)擊提交按鈕,它將會(huì)在您的屏幕中顯示 "站點(diǎn)名" 和 "網(wǎng)址",并且設(shè)置 "站點(diǎn)名" 和 "網(wǎng)址" 的兩個(gè) cookie。
使用 jsp 讀取 cookie
想要讀取 cookie,您就需要調(diào)用 request.getcookies() 方法來(lái)獲得一個(gè) javax.servlet.http.cookie 對(duì)象的數(shù)組,然后遍歷這個(gè)數(shù)組,使用 getname() 方法和 getvalue() 方法來(lái)獲取每一個(gè) cookie 的名稱和值。