国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JSP > 正文

Jsp Servlet基礎(chǔ)入門學(xué)習(xí)篇處理Cookie

2024-09-05 00:20:38
字體:
供稿:網(wǎng)友

  9.1 cookie概述

   cookie是服務(wù)器發(fā)送給瀏覽器的體積很小的純文本信息,用戶以后訪問同一個web服務(wù)器時(shí)瀏覽器會把它們原樣發(fā)送給服務(wù)器。通過讓服務(wù)器讀取它原先保存到客戶端的信息,網(wǎng)站能夠?yàn)闉g覽者提供一系列的方便,例如在線交易過程中標(biāo)識用戶身份、安全要求不高的場合避免用戶重復(fù)輸入名字和密碼、門戶網(wǎng)站的主頁定制、有針對性地投放廣告,等等。

   cookie的目的就是為用戶帶來方便,為網(wǎng)站帶來增值。雖然有著許多誤傳,事實(shí)上cookie并不會造成嚴(yán)重的安全威脅。cookie永遠(yuǎn)不會以任何方式執(zhí)行,因此也不會帶來病毒或攻擊你的系統(tǒng)。另外,由于瀏覽器一般只允許存放300個cookie,每個站點(diǎn)最多存放20個cookie,每個cookie的大小限制為4 kb,因此cookie不會塞滿你的硬盤,更不會被用作“拒絕服務(wù)”攻擊手段。

   9.2 servlet的cookie api

   要把cookie發(fā)送到客戶端,servlet先要調(diào)用new cookie(name,value)用合適的名字和值創(chuàng)建一個或多個cookie(2.1節(jié)),通過cookie.setxxx設(shè)置各種屬性(2.2節(jié)),通過response.addcookie(cookie)把cookie加入應(yīng)答頭(2.3節(jié))。

   要從客戶端讀入cookie,servlet應(yīng)該調(diào)用request.getcookies(),getcookies()方法返回一個cookie對象的數(shù)組。在大多數(shù)情況下,你只需要用循環(huán)訪問該數(shù)組的各個元素尋找指定名字的cookie,然后對該cookie調(diào)用getvalue方法取得與指定名字關(guān)聯(lián)的值,這部分內(nèi)容將在2.4節(jié)討論。

   9.2.1 創(chuàng)建cookie

   調(diào)用cookie對象的構(gòu)造函數(shù)可以創(chuàng)建cookie。cookie對象的構(gòu)造函數(shù)有兩個字符串參數(shù):cookie名字和cookie值。名字和值都不能包含空白字符以及下列字符:

  [ ] ( ) = , " / ? @ : ;

|||

   9.2.2 讀取和設(shè)置cookie屬性

   把cookie加入待發(fā)送的應(yīng)答頭之前,你可以查看或設(shè)置cookie的各種屬性。下面摘要介紹這些方法:

  getcomment/setcomment

  獲取/設(shè)置cookie的注釋。

  getdomain/setdomain

  獲取/設(shè)置cookie適用的域。一般地,cookie只返回給與發(fā)送它的服務(wù)器名字完全相同的服務(wù)器。使用這里的方法可以指示瀏覽器把cookie返回給同一域內(nèi)的其他服務(wù)器。注意域必須以點(diǎn)開始(例如.sitename.com),非國家類的域(如.com,.edu,.gov)必須包含兩個點(diǎn),國家類的域(如.com.cn,.edu.uk)必須包含三個點(diǎn)。

  getmaxage/setmaxage

  獲取/設(shè)置cookie過期之前的時(shí)間,以秒計(jì)。如果不設(shè)置該值,則cookie只在當(dāng)前會話內(nèi)有效,即在用戶關(guān)閉瀏覽器之前有效,而且這些cookie不會保存到磁盤上。參見下面有關(guān)longlivedcookie的說明。

  getname/setname

  獲取/設(shè)置cookie的名字。本質(zhì)上,名字和值是我們始終關(guān)心的兩個部分。由于httpservletrequest的getcookies方法返回的是一個cookie對象的數(shù)組,因此通常要用循環(huán)來訪問這個數(shù)組查找特定名字,然后用getvalue檢查它的值。

  getpath/setpath

  獲取/設(shè)置cookie適用的路徑。如果不指定路徑,cookie將返回給當(dāng)前頁面所在目錄及其子目錄下的所有頁面。這里的方法可以用來設(shè)定一些更一般的條件。例如,somecookie.setpath("/"),此時(shí)服務(wù)器上的所有頁面都可以接收到該cookie。

  getsecure/setsecure

  獲取/設(shè)置一個boolean值,該值表示是否cookie只能通過加密的連接(即ssl)發(fā)送。

  getvalue/setvalue

  獲取/設(shè)置cookie的值。如前所述,名字和值實(shí)際上是我們始終關(guān)心的兩個方面。不過也有一些例外情況,比如把名字作為邏輯標(biāo)記(也就是說,如果名字存在,則表示true)。

|||

  getversion/setversion

  獲取/設(shè)置cookie所遵從的協(xié)議版本。默認(rèn)版本0(遵從原先的netscape規(guī)范);版本1遵從rfc 2109 , 但尚未得到廣泛的支持。

   9.2.3 在應(yīng)答頭中設(shè)置cookie

   cookie可以通過httpservletresponse的addcookie方法加入到set-cookie應(yīng)答頭。下面是一個例子:

cookie usercookie = new cookie("user", "uid1234");
response.addcookie(usercookie);

   9.2.4 讀取保存到客戶端的cookie

   要把cookie發(fā)送到客戶端,先要創(chuàng)建cookie,然后用addcookie發(fā)送一個set-cookie http應(yīng)答頭。這些內(nèi)容已經(jīng)在上面的2.1節(jié)介紹。從客戶端讀取cookie時(shí)調(diào)用的是httpservletrequest的getcookies方法。該方法返回一個與http請求頭中的內(nèi)容對應(yīng)的cookie對象數(shù)組。得到這個數(shù)組之后,一般是用循環(huán)訪問其中的各個元素,調(diào)用getname檢查各個cookie的名字,直至找到目標(biāo)cookie。然后對這個目標(biāo)cookie調(diào)用getvalue,根據(jù)獲得的結(jié)果進(jìn)行其他處理。

   上述處理過程經(jīng)常會遇到,為方便計(jì)下面我們提供一個getcookievalue方法。只要給出cookie對象數(shù)組、cookie名字和默認(rèn)值,getcookievalue方法就會返回匹配指定名字的cookie值,如果找不到指定cookie,則返回默認(rèn)值。

   9.3 幾個cookie工具函數(shù)

   下面是幾個工具函數(shù)。這些函數(shù)雖然簡單,但是,在和cookie打交道的時(shí)候很有用。

   9.3.1 獲取指定名字的cookie值

   該函數(shù)是servletutilities.java的一部分。getcookievalue通過循環(huán)依次訪問cookie對象數(shù)組的各個元素,尋找是否有指定名字的cookie,如找到,則返回該cookie的值;否則,返回參數(shù)中給出的默認(rèn)值。getcookievalue能夠在一定程度上簡化cookie值的提取。

|||

商業(yè)源碼熱門下載www.html.org.cn

public static string getcookievalue(cookie[] cookies,
string cookiename,
string defaultvalue) {
for(int i=0; i<cookies.length; i++) {
cookie cookie = cookies;
if (cookiename.equals(cookie.getname()))
return(cookie.getvalue());
}
return(defaultvalue);
}

   9.3.2自動保存的cookie

   下面是longlivedcookie類的代碼。如果你希望cookie能夠在瀏覽器退出的時(shí)候自動保存下來,則可以用這個longlivedcookie類來取代標(biāo)準(zhǔn)的cookie類。

package hall;
import javax.servlet.http.*;
public class longlivedcookie extends cookie {
public static final int seconds_per_year = 60*60*24*365;
public longlivedcookie(string name, string value) {
super(name, value);
setmaxage(seconds_per_year);
}
}

   9.4.實(shí)例:定制的搜索引擎界面

   下面也是一個搜索引擎界面的例子,通過修改前面http狀態(tài)代碼的例子得到。在這個servlet中,用戶界面是動態(tài)生成而不是由靜態(tài)html文件提供的。servlet除了負(fù)責(zé)讀取表單數(shù)據(jù)并把它們發(fā)送給搜索引擎之外,還要把包含表單數(shù)據(jù)的cookie發(fā)送給客戶端。以后客戶再次訪問同一表單時(shí),這些cookie的值將用來預(yù)先填充表單,使表單自動顯示最近使用過的數(shù)據(jù)。

   searchenginesfrontend.java

   該servlet構(gòu)造一個主要由表單構(gòu)成的用戶界面。第一次顯示的時(shí)候,它和前面用靜態(tài)html頁面提供的界面差不多。然而,用戶選擇的值將被保存到cookie(本頁面將數(shù)據(jù)發(fā)送到customizedsearchengines servlet,由后者設(shè)置cookie)。用戶以后再訪問同一頁面時(shí),即使瀏覽器是退出之后再啟動,表單中也會自動填好上一次搜索所填寫的內(nèi)容。

|||

   注意該servlet用到了servletutilities.java,其中g(shù)etcookievalue前面已經(jīng)介紹過,headwithtitle用于生成html頁面的一部分。另外,這里也用到了前面已經(jīng)說明的longlivecookie類,我們用它來創(chuàng)建作廢期限很長的cookie。

package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;
public class searchenginesfrontend extends httpservlet {
public void doget(httpservletrequest request,
httpservletresponse response)
throws servletexception, ioexception {
cookie[] cookies = request.getcookies();
string searchstring =
servletutilities.getcookievalue(cookies,
"searchstring",
"java programming");
string numresults =
servletutilities.getcookievalue(cookies,
"numresults",
"10");
string searchengine =
servletutilities.getcookievalue(cookies,
"searchengine",
"google");
response.setcontenttype("text/html");
printwriter out = response.getwriter();
string title = "searching the web";
out.println(servletutilities.headwithtitle(title) +
"<body bgcolor=\"#fdf5e6\">\n" +
"<h1 align=\"center\">searching the web</h1>\n" +
"\n" +
"<form action=\"/servlet/hall.customizedsearchengines\">\n" +
"<center>\n" +
"search string:\n" +
"<input type=\"text\" name=\"searchstring\"\n" +
" value=\"" + searchstring + "\"><br>\n" +
"results to show per page:\n" +
"<input type=\"text\" name=\"numresults\"\n" +
" value=" + numresults + " size=3><br>\n" +
"<input type=\"radio\" name=\"searchengine\"\n" +
" value=\"google\"" +
checked("google", searchengine) + ">\n" +
"google |\n" +
"<input type=\"radio\" name=\"searchengine\"\n" +
" value=\"infoseek\"" +
checked("infoseek", searchengine) + ">\n" +
"infoseek |\n" +
"<input type=\"radio\" name=\"searchengine\"\n" +
" value=\"lycos\"" +
checked("lycos", searchengine) + ">\n" +
"lycos |\n" +
"<input type=\"radio\" name=\"searchengine\"\n" +
" value=\"hotbot\"" +
checked("hotbot", searchengine) + ">\n" +
"hotbot\n" +
"<br>\n" +
"<input type=\"submit\" value=\"search\">\n" +
"</center>\n" +
"</form>\n" +
"\n" +
"</body>\n" +
"</html>\n");
}
private string checked(string name1, string name2) {
if (name1.equals(name2))
return(" checked");
else
return("");
}
}

   customizedsearchengines.java

|||

   前面的searchenginesfrontend servlet把數(shù)據(jù)發(fā)送到customizedsearchengines servlet。本例在許多方面與前面介紹http狀態(tài)代碼時(shí)的例子相似,區(qū)別在于,本例除了要構(gòu)造一個針對搜索引擎的url并向用戶發(fā)送一個重定向應(yīng)答之外,還要發(fā)送保存用戶數(shù)據(jù)的cookies。

package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;
public class customizedsearchengines extends httpservlet {
public void doget(httpservletrequest request,
httpservletresponse response)
throws servletexception, ioexception {
string searchstring = request.getparameter("searchstring");
cookie searchstringcookie =
new longlivedcookie("searchstring", searchstring);
response.addcookie(searchstringcookie);
searchstring = urlencoder.encode(searchstring);
string numresults = request.getparameter("numresults");
cookie numresultscookie =
new longlivedcookie("numresults", numresults);
response.addcookie(numresultscookie);
string searchengine = request.getparameter("searchengine");
cookie searchenginecookie =
new longlivedcookie("searchengine", searchengine);
response.addcookie(searchenginecookie);
searchspec[] commonspecs = searchspec.getcommonspecs();
for(int i=0; i<commonspecs.length; i++) {
searchspec searchspec = commonspecs;
if (searchspec.getname().equals(searchengine)) {
string url =
searchspec.makeurl(searchstring, numresults);
response.sendredirect(url);
return;
}
}
response.senderror(response.sc_not_found,
"no recognized search engine specified.");
}
public void dopost(httpservletrequest request,
httpservletresponse response)
throws servletexception, ioexception {
doget(request, response);
}
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 荥经县| 扶余县| 浦江县| 沙洋县| 辰溪县| 濉溪县| 永春县| 南通市| 思南县| 西充县| 济南市| 吴桥县| 紫阳县| 开原市| 昌吉市| 湖南省| 体育| 临西县| 自贡市| 扶沟县| 明溪县| 兴安盟| 临海市| 房产| 乐都县| 浑源县| 苗栗县| 太仆寺旗| 永善县| 广平县| 凤阳县| 逊克县| 海门市| 鹤壁市| 五大连池市| 库车县| 灵山县| 昭通市| 朝阳区| 盈江县| 秦安县|