?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傲颉!