JavaWeb之Cookie和Session

?Cookie

概念:

完成會(huì)話跟蹤的一種機(jī)制

cookie 機(jī)制采用的是在客戶端保持 HTTP 狀態(tài)信息的方案匀们。

cookie 是在瀏覽器訪問(wèn) WEB 服務(wù)器的某個(gè)資源時(shí)哑姚,由 WEB 服務(wù)器在 HTTP 響應(yīng)頭中附帶傳送給瀏覽器的一個(gè)小文本文件。

一旦 WEB 服務(wù)器保存了某個(gè) cookie缀踪,那么它在以后每次訪問(wèn)該 WEB 服務(wù)器時(shí)井氢,都會(huì)在 HTTP 請(qǐng)求頭中將這個(gè) cookie 回傳給 WEB 服務(wù)器。

一個(gè) cookie 只能標(biāo)識(shí)一種信息,它至少含有一個(gè)標(biāo)識(shí)該信息的名稱和設(shè)置值躏哩。

一個(gè) WEB 站點(diǎn)可以給一個(gè) WEB 瀏覽器發(fā)送多個(gè) cookie署浩,一個(gè) WEB? 瀏覽器也可以存儲(chǔ)多個(gè) WEB 站點(diǎn)提供的 cookie。

瀏覽器一般只允許存放 300 個(gè) cookie扫尺,每個(gè)站點(diǎn)最多存放 20 個(gè) cookie筋栋,每個(gè) cookie 的大小限制為 4KB。

注:

如果不設(shè)置最大時(shí)效正驻,表示這個(gè) cookie 生命周期為瀏覽器會(huì)話期間弊攘,只要關(guān)閉瀏覽器窗口,cookie 就消失了姑曙,稱之為會(huì)話 cookie襟交,這種一般不保存于硬盤(pán)上,而是保存在內(nèi)存中伤靠。

如果設(shè)置了最大時(shí)效捣域,瀏覽器會(huì)把 cookie 保存在硬盤(pán)上,關(guān)閉后再打開(kāi)瀏覽器醋界,這些 cookie 依然有效直到超過(guò)設(shè)定的最大時(shí)效竟宋。

Cookie 的作用范圍:

可以作用于當(dāng)前目錄和當(dāng)前目錄的子目錄,但不能作用于當(dāng)前目錄的上一級(jí)目錄形纺,可以通過(guò) setPath 方法來(lái)設(shè)置 Cookie? 的作用范圍丘侠,其中 / 代表站點(diǎn)的根目錄。

案例:

通過(guò) cookie 實(shí)現(xiàn)自動(dòng)登錄:

新建 index.jsp:

通過(guò)獲取 login.jsp 的傳參 name逐样,如果 name 不為空蜗字,則存入 cookie 中,設(shè)置最大時(shí)效為 10 秒脂新,超過(guò)時(shí)長(zhǎng)則 cookie 過(guò)期挪捕,需要重新登錄,如果為空争便,則從 cookie 里面取值级零,如果值不為空,則顯示滞乙,為空則跳轉(zhuǎn)到登錄頁(yè)面奏纪。

login.jsp 有如下操作:

點(diǎn)擊按鈕,將輸入框的值傳給 index.jsp

Session

概念:

session 機(jī)制采用的是在服務(wù)器端保持 HTTP 狀態(tài)信息的方案斩启。當(dāng)程序需要為某個(gè)客戶端請(qǐng)求創(chuàng)建一個(gè) session 時(shí)序调,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否包含一個(gè) session 標(biāo)識(shí)(即 sessionId),如果已經(jīng)包含說(shuō)明以前已經(jīng)創(chuàng)建過(guò)兔簇,此時(shí)服務(wù)器把這個(gè) session 查詢出來(lái)发绢,如果沒(méi)有硬耍,則創(chuàng)建一個(gè)新的 session 并且生成一個(gè)與此 session 相關(guān)聯(lián)的 sessionId,這個(gè) sessionId 將在本次響應(yīng)中返回給客戶端保存边酒。

過(guò)程:

客戶端發(fā)出請(qǐng)求到服務(wù)器经柴,服務(wù)器新建 HttpSession 對(duì)象,并響應(yīng)(Set-Cookie:xxxxxxxxx)甚纲,下次請(qǐng)求則攜帶上次所創(chuàng)建的 session口锭,通過(guò) cookie 發(fā)起。

HttpSession 生命周期:

什么時(shí)候創(chuàng)建?HttpSession 對(duì)象介杆?

1、對(duì)于 JSP:是否瀏覽器訪問(wèn)服務(wù)端的任何一個(gè) JSP韭寸,服務(wù)器不一定會(huì)立即創(chuàng)建一個(gè) HttpSession

有如下兩種情況:

① 若當(dāng)前的 JSP 是客戶端訪問(wèn)的當(dāng)前 WEB 應(yīng)用的第一個(gè)資源春哨,且 JSP 的 page 指定的 session 屬性值為 false,則服務(wù)器就不會(huì)為 JSP 創(chuàng)建一個(gè) HttpSession 對(duì)象恩伺。

② 若當(dāng)前的 JSP 不是客戶端訪問(wèn)的當(dāng)前 WEB 應(yīng)用的第一個(gè)資源赴背,且其他頁(yè)面已經(jīng)創(chuàng)建一個(gè) HttpSession 對(duì)象,則服務(wù)器也不會(huì)為當(dāng)前 JSP 頁(yè)面創(chuàng)建一個(gè)?HttpSession 對(duì)象晶渠,而會(huì)和當(dāng)前會(huì)話關(guān)聯(lián)的那個(gè)?HttpSession 對(duì)象返回給當(dāng)前的 JSP 頁(yè)面凰荚。

2、對(duì)于 Servlet:若 Servlet 是客戶端訪問(wèn)的第一個(gè) WEB 應(yīng)用的資源褒脯,則只有調(diào)用了 request.getSession() 或 request.getSession(true) 才會(huì)創(chuàng)建?HttpSession 對(duì)象

session = "false" 是指當(dāng)前 JSP 頁(yè)面禁用 session 隱含變量便瑟,但可以使用其他的顯式的?HttpSession 對(duì)象。

什么時(shí)候銷(xiāo)毀?HttpSession 對(duì)象番川?

1到涂、直接調(diào)用?HttpSession 的 invalidate() 方法:該方法使?HttpSession 失效

2、服務(wù)器卸載了當(dāng)前 WEB 應(yīng)用

3颁督、超出了?HttpSession 的過(guò)期時(shí)間践啄。

注:關(guān)閉瀏覽器只會(huì)使存儲(chǔ)在客戶端瀏覽器內(nèi)存中的 session cookie 失效,不會(huì)使服務(wù)端的 session 對(duì)象失效

① 設(shè)置?HttpSession 的過(guò)期時(shí)間:session.setMaxInactiveInterval(5)沉御;單位為秒

② 在 web.xml 文件中設(shè)置?HttpSession 的過(guò)期時(shí)間:?jiǎn)挝粸榉昼?/p>

? ? <session-config>

? ? ? ? ? ? <session-timeout>30</session-timeout>

? ? </session-config>

HttpSession 常用方法:

1屿讽、獲取 session 對(duì)象:request.getSession()、request.getSession(boolean create)

2吠裆、屬性相關(guān)的:setAttribute伐谈、getAttribute、removeAttribute

3硫痰、使 HttpSession 失效的:invalidate() 方法

4衩婚、設(shè)置其最大失效的 setMaxInactiveInterval

當(dāng)瀏覽器把 cookie 禁用了,如何來(lái)跟蹤 session:

在跳轉(zhuǎn)的 JSP 地址上添加如下方法:

response.encodeURL("login.jsp")

JavaWeb 中相對(duì)路徑和絕對(duì)路徑

1效斑、絕對(duì)路徑的問(wèn)題:

⑴ 開(kāi)發(fā)時(shí)建議編寫(xiě)“絕對(duì)路徑”:寫(xiě)絕對(duì)路徑肯定沒(méi)有問(wèn)題非春,但寫(xiě)相對(duì)路徑可能會(huì)有問(wèn)題。

在由 Servlet 轉(zhuǎn)發(fā)到 JSP 頁(yè)面時(shí),此時(shí)瀏覽器地址欄上顯示的是 Servlet 的路徑奇昙,而若 JSP 頁(yè)面的超鏈接還是相對(duì)于該 JSP 頁(yè)面的地址护侮,則可能會(huì)出現(xiàn)路徑混亂的問(wèn)題。

比如說(shuō):

在項(xiàng)目的根目錄下有個(gè) a.jsp储耐,在 WEB-INF 目錄下的 path 目錄下有 b.jsp 和 c.jsp羊初,此時(shí),a.jsp 通過(guò) Servlet 的方式轉(zhuǎn)發(fā)到 b.jsp(b.jsp 里有個(gè)超鏈接什湘,此超鏈接跳轉(zhuǎn)到同個(gè)路徑下的 c.jsp)长赞,這時(shí)網(wǎng)頁(yè)會(huì)提示無(wú)法找到該頁(yè)面。

⑵ 編寫(xiě)絕對(duì)路徑可以避免以上問(wèn)題:

① 在 JavaWEB 中什么叫“絕對(duì)路徑”:相對(duì)于當(dāng)前 WEB 應(yīng)用的根路徑的路徑闽撤,即任何的路徑都必須帶上 contextPath

② 如何編寫(xiě):

⑶ JavaWEB 開(kāi)發(fā)中的 / 代表什么得哆?

① 當(dāng)前 WEB 應(yīng)用的根路徑:http://localhost:8080/contextPath/

? ? 請(qǐng)求轉(zhuǎn)發(fā)時(shí):request.getRequestDispatcher("/path/b.jsp").forward(request,response);

? ? web.xml 文件中映射的 Servlet 訪問(wèn)路徑:

② WEB 站點(diǎn)的根路徑:http://localhost:8080/

以下幾種方式表示:

超鏈接:<a href="/TestServlet"></a>

表單中的 action:<form action="/login.jsp"/>

請(qǐng)求重定向:response.sendRedirect("/")

表單的重復(fù)提交

1、重復(fù)提交的情況

⑴ 在表單提交到一個(gè) Servlet哟旗,而 Servlet 又通過(guò)請(qǐng)求轉(zhuǎn)發(fā)的方式響應(yīng)一個(gè) JSP(HTML)頁(yè)面贩据,此時(shí)地址欄還保留著 Servlet 的那個(gè)路徑,在響應(yīng)頁(yè)面點(diǎn)擊“刷新”闸餐。

⑵ 在響應(yīng)頁(yè)面沒(méi)有到達(dá)時(shí)重復(fù)點(diǎn)擊“提交按鈕”

⑶ 點(diǎn)擊“返回”饱亮,再點(diǎn)擊“提交”

2、如何避免表單的重復(fù)提交

在表單中做一個(gè)標(biāo)記舍沙,提交到 Servlet 時(shí)近上,檢查標(biāo)記是否存在且是否和預(yù)定義的標(biāo)記一致,若一致场勤,則受理請(qǐng)求戈锻,并銷(xiāo)毀標(biāo)記,若不一致或沒(méi)有標(biāo)記和媳,則直接響應(yīng)提示信息:“重復(fù)提交”

使用方法:

把標(biāo)記放在 session 中

使用步驟:

⑴ 在原表單頁(yè)面格遭,生成一個(gè)隨機(jī)值 token

⑵ 在原表單頁(yè)面,把 token 值放入 session 屬性中

⑶ 在原表單頁(yè)面留瞳,把 token 值放入到隱藏域中

⑷ 在目標(biāo)的 Servlet 中:獲取 session 和隱藏域中的 token 值

⑸ 比較兩個(gè)值是否一致:若一致拒迅,受理請(qǐng)求,且把 session 中的 token 屬性清除

⑹ 若不一致她倘,則直接響應(yīng)提示頁(yè)面:“重復(fù)提交”

注:驗(yàn)證碼的原理和表單重復(fù)提交的原理一致


以上為本人的一些學(xué)習(xí)筆記璧微,如有出錯(cuò)歡迎指正,陸續(xù)更新S擦骸G傲颉!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荧止,一起剝皮案震驚了整個(gè)濱河市屹电,隨后出現(xiàn)的幾起案子阶剑,更是在濱河造成了極大的恐慌,老刑警劉巖危号,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牧愁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡外莲,警方通過(guò)查閱死者的電腦和手機(jī)猪半,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)偷线,“玉大人磨确,你說(shuō)我怎么就攤上這事∩睿” “怎么了俐填?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)翔忽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)盏檐,這世上最難降的妖魔是什么歇式? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮胡野,結(jié)果婚禮上材失,老公的妹妹穿的比我還像新娘。我一直安慰自己硫豆,他們只是感情好龙巨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著熊响,像睡著了一般旨别。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汗茄,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天秸弛,我揣著相機(jī)與錄音,去河邊找鬼洪碳。 笑死递览,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞳腌。 我是一名探鬼主播绞铃,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嫂侍!你這毒婦竟也來(lái)了儿捧?” 一聲冷哼從身側(cè)響起荚坞,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纯命,沒(méi)想到半個(gè)月后西剥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亿汞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年瞭空,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疗我。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咆畏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吴裤,到底是詐尸還是另有隱情旧找,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布麦牺,位于F島的核電站钮蛛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏剖膳。R本人自食惡果不足惜魏颓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吱晒。 院中可真熱鬧甸饱,春花似錦、人聲如沸仑濒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)墩瞳。三九已至驼壶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矗烛,已是汗流浹背辅柴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞭吃,地道東北人碌嘀。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像歪架,于是被迫代替她去往敵國(guó)和親股冗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容