會(huì)話技術(shù)簡(jiǎn)介
- session和cookie都是會(huì)話技術(shù)
- 瀏覽購(gòu)物網(wǎng)站,在沒有登陸的情況下把商品放入購(gòu)物車(沒登陸,不存數(shù)據(jù)庫(kù)),然后搜索其他商品放入購(gòu)物車,我們會(huì)訪問多個(gè)不同的網(wǎng)頁(yè),但是我們所放入購(gòu)物車的商品卻一直都存放著,即使跳轉(zhuǎn)了N個(gè)不同的頁(yè)面后(數(shù)據(jù)存放在域?qū)ο笾衧ession(存放在服務(wù)端),cookie(存放在客戶端))
會(huì)話技術(shù)
- 從打開客戶端訪問某個(gè)站點(diǎn),到關(guān)閉這個(gè)瀏覽器的整個(gè)過程稱為一次會(huì)話
- 會(huì)話技術(shù)是記錄本次會(huì)話中客戶端的狀態(tài)與數(shù)據(jù)
- 會(huì)話技術(shù)分為Cookie和Session
- Cookie:數(shù)據(jù)存儲(chǔ)在客戶端本地,減少服務(wù)器端的存儲(chǔ)的壓力,安全性不好,客戶端可以清除cookie
- Session:將數(shù)據(jù)存儲(chǔ)到服務(wù)器端,安全性相對(duì)好,增加服務(wù)器的壓力
cookie
- Cookie技術(shù)是將用戶的數(shù)據(jù)存儲(chǔ)到客戶端的技術(shù)
- 服務(wù)器怎么把cookie寫給客戶端
- 服務(wù)器怎么獲取客戶端攜帶的cookie
- response把cookie信息放在響應(yīng)頭(set-cookie)中返回給客戶端
服務(wù)端向客戶端發(fā)送一個(gè)cookie
- cookie通過響應(yīng)頭發(fā)送給客戶端(Set-Cookie)
- 為什么不寫在響應(yīng)體中的原因:響應(yīng)體放的是客戶端顯示的內(nèi)容
- 創(chuàng)建cookie
Cookie cookie = new Cookie(String name, String value);//cookie不支持中文
//cookie以響應(yīng)頭的形式發(fā)送給客戶端
response.addCookie(cookie);
- cookie默認(rèn)存儲(chǔ)的時(shí)間為一個(gè)會(huì)話的長(zhǎng)度(默認(rèn)cookie是會(huì)話級(jí)別的,存放在內(nèi)存中)
為cookie設(shè)置持久化時(shí)間
- cookie.setMaxAge(int seconds); ---時(shí)間秒
- 如果不設(shè)置持久化時(shí)間,cookie會(huì)存儲(chǔ)在瀏覽器的內(nèi)存中,瀏覽器關(guān)閉cookie信息銷毀(會(huì)話級(jí)別的cookie)
- 如果設(shè)置持久化時(shí)間,cookie信息會(huì) 被持久化到瀏覽器的磁盤文件里,過期瀏覽器 自動(dòng)刪除該cookie信息
cookie.setMaxAge(int second)\\從會(huì)話級(jí)別的cookie轉(zhuǎn)為持久級(jí)別的cookie
設(shè)置Cookie的攜帶路徑
- 如果不設(shè)置攜帶路徑,那么該cookie信息會(huì)在訪問產(chǎn)生該cookie的web資源所在的路徑都攜帶cookie信息
- 如果設(shè)置了攜帶路徑,就只會(huì)在訪問指定的路徑中才會(huì)攜帶此cookie
- cookie.setPath():
//1、創(chuàng)建cookie對(duì)象
Cookie cookie = new Cookie("name","zhangsan");
//1.1 為cookie設(shè)置持久化時(shí)間 ---- cookie信息在硬盤上保存的時(shí)間
cookie.setMaxAge(10*60);//10分鐘 ---- 時(shí)間設(shè)置為0代表刪除該cookie
//1.2 為cookie設(shè)置攜帶的路徑
//cookie.setPath("/WEB16/sendCookie");//訪問sendCookie資源時(shí)才攜帶這個(gè)cookie
cookie.setPath("/WEB16");//訪問WEB16下的任何資源時(shí)都攜帶這個(gè)cookie
//cookie.setPath("/");//訪問服務(wù)器下的所有的資源都攜帶這個(gè)cookie
//2、將cookie中存儲(chǔ)的信息發(fā)送到客戶端---頭
response.addCookie(cookie);
刪除客戶端的cookie
- 如果想刪除客戶端的已經(jīng)存儲(chǔ)的cookie信息,那么就使用同名同路徑的持久化時(shí)間為0的cookie進(jìn)行覆蓋即可
//刪除客戶端保存 name=zhangsan的cookie信息
Cookie cookie = new Cookie("name","");
//將path設(shè)置成與要?jiǎng)h除cookie的path一致
cookie.setPath("/WEB16");
//設(shè)置時(shí)間是0
cookie.setMaxAge(0);
response.addCookie(cookie);
服務(wù)器獲取客戶端發(fā)送的cookie
- cookie信息是以請(qǐng)求頭的方式發(fā)送到服務(wù)器端的
- 通過request獲得所有的Cookie
Cookie[] cookies = request.getCookies();
- 遍歷Cookie數(shù)組,通過Cookie的名稱獲得我們想要的Cookie
//獲得客戶端攜帶的cookie的數(shù)據(jù)
Cookie[] cookies = request.getCookies();
//Cookie cookie = new Cookie("name","zhangsan");
//通過cookie名稱獲得想要的cookie
if(cookies!=null){
for(Cookie cookie : cookies){
//獲得cookie的名稱
String cookieName = cookie.getName();
if(cookieName.equals("name")){
//獲得該cookie的值
String cookieValue = cookie.getValue();
System.out.println(cookieValue);
}
}
}
通過cookie獲取用戶上次登陸的時(shí)間
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String lastTime = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equalsIgnoreCase("lastAccessTime")) {
lastTime = cookie.getValue();
}
}
}
if (lastTime == null) {
response.getWriter().write("歡迎登陸");
}else {
response.getWriter().write("歡迎登陸,你上次登陸時(shí)間為: " + lastTime);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(new Date());
Cookie cookie = new Cookie("lastAccessTime", format);
cookie.setMaxAge(60 * 10);//10分鐘
response.addCookie(cookie);
session
- Session技術(shù)是將數(shù)據(jù)存儲(chǔ)在服務(wù)器端的技術(shù),會(huì)為每個(gè)客戶端都創(chuàng)建一塊內(nèi)存空間存儲(chǔ)客戶的數(shù)據(jù),但客戶端需要每次都攜帶一個(gè)標(biāo)識(shí)ID去服務(wù)器中尋找屬于自己的內(nèi)存空間
- 服務(wù)端開辟了存放session的內(nèi)存,并把編號(hào)發(fā)給客戶端,客戶端存取數(shù)據(jù)時(shí)把session編號(hào)帶過去
- session技術(shù)是基于cookie的--存儲(chǔ)session編號(hào)(JSESSONID)
- 發(fā)送編號(hào)到服務(wù)器,根據(jù)編號(hào)去尋找session的位置是服務(wù)器與客戶端自動(dòng)完成的,不需要自己手動(dòng)編寫代碼(session比cookie更容易,就一個(gè)api)
- session是一個(gè)域?qū)ο?/li>
- 公司給你配了個(gè)保險(xiǎn)柜放資料,你可以上下班帶回家(cookie),但是不安全,容易被人偷或者丟失.也可以放公司的保險(xiǎn)柜里(session),但是你需要把鑰匙(sessionId)帶回家.
創(chuàng)建/獲取Session對(duì)象
- 獲得專屬于當(dāng)前會(huì)話的Session對(duì)象,如果服務(wù)器端沒有該會(huì)話的Session對(duì)象會(huì)創(chuàng)建一個(gè)新的Session返回
- 如果已經(jīng)有了屬于該會(huì)話的Session直接將已有 的Session返回
- 實(shí)質(zhì)就是根據(jù)JSESSIONID判斷該客戶端是否在服務(wù)器上已經(jīng)存在session了
//創(chuàng)建屬于該客戶端的session對(duì)象,如果存在,則獲取
HttpSession session = request.getSession();
向session中存取數(shù)據(jù)
- session也是一個(gè)域?qū)ο?/li>
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
Session面試題
- 你網(wǎng)session存放的數(shù)據(jù)沒了,是什么原因:
- 瀏覽器請(qǐng)掉cookie緩存了(JSESSIONID沒有了)
- session過期/失效了
- Session的生命周期(面試題或者筆試題,問的非常多)
創(chuàng)建:第一次執(zhí)行request.getSession()的時(shí)候創(chuàng)建
-
銷毀:
- 服務(wù)器關(guān)閉
- session過期/失效(默認(rèn)30分鐘),時(shí)間的起算點(diǎn):從不操作服務(wù)端資源開始時(shí)(web.xml)
<session-config> <session-timeout>30</session-timeout> </session-config>- 手動(dòng)銷毀session.invalidate()
- 瀏覽器關(guān)閉了Session就銷毀了嗎
- 不是
JSESSONID持久化
- 默認(rèn)JSESSONID的cookie是會(huì)話級(jí)別的,把它設(shè)置成持久化級(jí)別的
- 手動(dòng)創(chuàng)建一個(gè)存儲(chǔ)JSESSONID的cookie,為cookie設(shè)置持久化時(shí)間
//創(chuàng)建屬于該客戶端(會(huì)話)的私有的session區(qū)域
/* request.getSession()方法內(nèi)部會(huì)判斷 該客戶端是否在服務(wù)器端已經(jīng)存在session
* 如果該客戶端在此服務(wù)器不存在session 那么就會(huì)創(chuàng)建一個(gè)新的session對(duì)象
* 如果該客戶端在此服務(wù)器已經(jīng)存在session 獲得已經(jīng)存在的該session返回
*/
HttpSession session = request.getSession();
session.setAttribute("name", "jerry");
String id = session.getId();//該session對(duì)象的編號(hào)id
//手動(dòng)創(chuàng)建一個(gè)存儲(chǔ)JSESSIONID的Cookie 為該cookie設(shè)置持久化時(shí)間
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setPath("/WEB16/");
cookie.setMaxAge(60*10);
response.addCookie(cookie);
response.getWriter().write("JSESSIONID:"+id);
驗(yàn)證碼校驗(yàn)功能
- web工程中讀取 文件,必須使用絕對(duì)磁盤路徑
- String path = getServletContext().getRealPath("/WEB-INF/new_words.txt");