會話管理----cookie

2.1 軟件中的會話

一次會話: 打開瀏覽器 -> 訪問一些服務(wù)器內(nèi)容 -> 關(guān)閉瀏覽器

登錄場景:

打開瀏覽器 -> 瀏覽到登陸頁面 -> 輸入用戶名和密碼 -> 訪問到用戶主頁(顯示用戶名)

修改密碼(輸入原密碼)

修改收貨地址

.......

問題:在此處登錄會話過程中產(chǎn)生的數(shù)據(jù)(用戶會話數(shù)據(jù))如何保存下來呢?

購物場景:(兩次會話)

打開瀏覽器 -> 瀏覽商品列表? -> 加入購物車(把商品信息保存下來)? -> 關(guān)閉瀏覽器

打開瀏覽器->? 直接進(jìn)入購物車 -> 查看到上次加入購物車的商品 -> 下訂單 -> 支付

問題: 在購物會話過程中,如何保存商品信息??

會話管理: 管理瀏覽器客戶端 和 服務(wù)器端之間會話過程中產(chǎn)生的會話數(shù)據(jù)。

域?qū)ο螅?可以實現(xiàn)資源之間的數(shù)據(jù)共享。

request域?qū)ο?/b>

context域?qū)ο?/b>(servletcontext)

登錄場景

小張: 輸入“張三” (保存數(shù)據(jù): context.setAttribute("name","張三")) -> 用戶主頁(顯示“張三”)

小李: 輸入“李四”(保存數(shù)據(jù):context.setAttribute("name","李四")) -> 用戶主頁(顯示“李四”)

問題: context是所有用戶公有的資源?。?!會覆蓋數(shù)據(jù)(name相同,李四會覆蓋張三)。

小張: 輸入“張三”(保存數(shù)據(jù): request.setAttribute("name","張三"))- > 用戶主頁(顯示“張三”) 問題: 一定要使用轉(zhuǎn)發(fā)技術(shù)來跳轉(zhuǎn)頁面?。。。ǖ接脩糁黜?,再修改密碼又要使用轉(zhuǎn)發(fā),導(dǎo)致整個頁面一直要使用轉(zhuǎn)發(fā)技術(shù))

解決辦法: 可以使用session域?qū)ο髞肀4鏁挃?shù)據(jù)?。?!

2.3 會話技術(shù)的分類(區(qū)別)

Cookie技術(shù):會話數(shù)據(jù)保存在瀏覽器客戶端。

Session技術(shù):會話數(shù)據(jù)保存在服務(wù)器端。

3.1 特點 ? ? ??Cookie技術(shù):會話數(shù)據(jù)保存在瀏覽器客戶端。

3.2 Cookie技術(shù)核心? ? (學(xué)習(xí)cookie分為三步)?

??Cookie類:用于存儲會話數(shù)據(jù)

1)構(gòu)造Cookie對象

Cookie(java.lang.String name, java.lang.String value)一定要使用有參數(shù)構(gòu)造方法

2)設(shè)置cookie(設(shè)置完cookie,發(fā)送到瀏覽器端,1步,2步,cookie寫在服務(wù)器,我們在服務(wù)器只是把這個cookie創(chuàng)建出來,但是并不保存這個數(shù)據(jù),而是把cookie數(shù)據(jù)發(fā)送到瀏覽器端去保存 ? ?3 步)

void setPath(java.lang.String uri)? :設(shè)置cookie的有效訪問路徑

void setMaxAge(int expiry) : 設(shè)置cookie的有效時間

void setValue(java.lang.String newValue) :設(shè)置cookie的值

3)發(fā)送cookie到瀏覽器端保存(cookie技術(shù)保存在瀏覽器,以上這些代碼肯定在服務(wù)器上寫,服務(wù)器是運行這些代碼的,我們在服務(wù)器只是把Cookie創(chuàng)建出來,但是服務(wù)器端并不去保存數(shù)據(jù),而是把cookie數(shù)據(jù)發(fā)送到瀏覽器端去保存,瀏覽器保存之后,瀏覽器是可以再發(fā)回來的,發(fā)回來后服務(wù)器又可以去接受這個cookie,到第四步

(這個方法在HTTPServletResponse里面)void response.addCookie(Cookie cookie)? : 發(fā)送cookie

4)服務(wù)器接收cookie

(在HttpServletRequest里面)Cookie[] request.getCookies()? : 接收cookie

cookie要寫到服務(wù)器中。servlet是放在服務(wù)器中運行的,所以我們可以寫一個servlet

第一個cookie的程序

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//1.創(chuàng)建Cookie對象

Cookie cookie1 = new Cookie("name","eric");

2.把cookie數(shù)據(jù)發(fā)送到瀏覽器端(因為cookie數(shù)據(jù)保存到瀏覽器端,服務(wù)器返回給瀏覽器的數(shù)據(jù)為response里面,cookie是跟在響應(yīng)頭里面 set——cookie)

//Cookie cookie1 = new Cookie("email","eric@qq.com");

response.addCookie(cookie);

* 2)設(shè)置cookie的有效時間


3.3 Cookie原理

1)服務(wù)器創(chuàng)建cookie對象,把會話數(shù)據(jù)存儲到cookie對象中。

new Cookie("name","value");

2) 服務(wù)器發(fā)送cookie信息到瀏覽器

response.addCookie(cookie);

舉例: set-cookie: name=eric? (隱藏發(fā)送了一個set-cookie名稱的響應(yīng)頭)

3)瀏覽器得到服務(wù)器發(fā)送的cookie,然后保存在瀏覽器端。

4)瀏覽器在下次訪問服務(wù)器時,會帶著cookie信息

舉例: cookie: name=eric? (隱藏帶著一個叫cookie名稱的請求頭)

5)服務(wù)器接收到瀏覽器帶來的cookie信息

request.getCookies();

3.4 Cookie的細(xì)節(jié)

1)void setPath(java.lang.String uri)? :設(shè)置cookie的有效訪問路徑。有效路徑指的是cookie的有效路徑保存在哪里,那么瀏覽器在有效路徑下訪問服務(wù)器時就會帶著cookie信息,否則不帶cookie信息。

2)void setMaxAge(int expiry) : 設(shè)置cookie的有效時間。

正整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的緩存目錄(硬盤中),數(shù)值表示保存的時間。

負(fù)整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的內(nèi)存中。瀏覽器關(guān)閉cookie就丟失了!!

零:表示刪除同名的cookie數(shù)據(jù)

3)Cookie數(shù)據(jù)類型只能保存非中文字符串類型的。可以保存多個cookie,但是瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。


4 Session技術(shù)

4.1 引入

Cookie的局限:

1)Cookie只能存字符串類型。不能保存對象

2)只能存非中文。

3)1個Cookie的容量不超過4KB。

如果要保存非字符串,超過4kb內(nèi)容,只能使用session技術(shù)?。。?/p>

Session特點:會話數(shù)據(jù)保存在服務(wù)器端。(保存到服務(wù)器的內(nèi)存中)

4.2 Session技術(shù)核心

HttpSession類:用于保存會話數(shù)據(jù)

1)創(chuàng)建或得到session對象

HttpSession getSession()

HttpSession getSession(boolean create)

2)設(shè)置session對象

void setMaxInactiveInterval(int interval)? : 設(shè)置session的有效時間

void invalidate()? ? : 銷毀session對象

java.lang.String getId()? : 得到session編號

3)保存會話數(shù)據(jù)到session對象

void setAttribute(java.lang.String name, java.lang.Object value)? : 保存數(shù)據(jù)

java.lang.Object getAttribute(java.lang.String name)? : 獲取數(shù)據(jù)

void removeAttribute(java.lang.String name) : 清除數(shù)據(jù)


public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//1.創(chuàng)建session對象

HttpSession session = request.getSession();

* 得到session編號

System.out.println("id="+session.getId());

* 修改session的有效時間

//session.setMaxInactiveInterval(20);

* 手動發(fā)送一個硬盤保存的cookie給瀏覽器

Cookie c = new Cookie("JSESSIONID",session.getId());

c.setMaxAge(60*60);

response.addCookie(c);

//2.保存會話數(shù)據(jù)

session.setAttribute("name", "rose");

}


銷毀session對象

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

HttpSession session = request.getSession(false);

if(session!=null){

session.invalidate();//手動銷毀

}

System.out.println("銷毀成功");

}

* 從session域?qū)ο笾腥〕鰰挃?shù)據(jù)

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//1.得到session對象

HttpSession session = request.getSession(false);

if(session==null){

System.out.println("沒有找到對應(yīng)的sessino對象");

return;

}

/**

* 得到session編號

*/

System.out.println("id="+session.getId());

//2.取出數(shù)據(jù)

String name = (String)session.getAttribute("name");

System.out.println("name="+name);

}



4.3 Session原理問題: 服務(wù)器能夠識別不同的瀏覽者?。?!

現(xiàn)象:? 前提: 在哪個session域?qū)ο蟊4鏀?shù)據(jù),就必須從哪個域?qū)ο笕〕觯。。。g覽器1:(給s1分配一個唯一的標(biāo)記:s001,把s001發(fā)送給瀏覽器)1)創(chuàng)建session對象,保存會話數(shù)據(jù)HttpSession session = request.getSession();? --保存會話數(shù)據(jù) s1瀏覽器1的新窗口(帶著s001的標(biāo)記到服務(wù)器查詢,s001->s1,返回s1)1)得到session對象的會話數(shù)據(jù)? ? HttpSession session = request.getSession();? --可以取出? s1新的瀏覽器1:(沒有帶s001,不能返回s1)1)得到session對象的會話數(shù)據(jù)? ? HttpSession session = request.getSession();? --不可以取出? s2瀏覽器2:(沒有帶s001,不能返回s1)1)得到session對象的會話數(shù)據(jù)? ? HttpSession session = request.getSession();? --不可以取出? s3代碼解讀:HttpSession session = request.getSession();1)第一次訪問創(chuàng)建session對象,給session對象分配一個唯一的ID,叫JSESSIONIDnew HttpSession();2)把JSESSIONID作為Cookie的值發(fā)送給瀏覽器保存Cookie cookie = new Cookie("JSESSIONID", sessionID);response.addCookie(cookie);3)第二次訪問的時候,瀏覽器帶著JSESSIONID的cookie訪問服務(wù)器4)服務(wù)器得到JSESSIONID,在服務(wù)器的內(nèi)存中搜索是否存放對應(yīng)編號的session對象。if(找到){return map.get(sessionID);}Map]

<"s001", s1>

<"s001,"s2>

5)如果找到對應(yīng)編號的session對象,直接返回該對象

6)如果找不到對應(yīng)編號的session對象,創(chuàng)建新的session對象,繼續(xù)走1的流程

結(jié)論:通過JSESSION的cookie值在服務(wù)器找session對象?。。。?!

4.4 Sesson細(xì)節(jié)

1)java.lang.String getId()? : 得到session編號

2)兩個getSession方法:

getSession(true) / getSession()? : 創(chuàng)建或得到session對象。沒有匹配的session編號,自動創(chuàng) 建新的session對象。

getSession(false):? ? ? ? ? ? ? 得到session對象。沒有匹配的session編號,返回null

3)void setMaxInactiveInterval(int interval)? : 設(shè)置session的有效時間

session對象銷毀時間:

3.1 默認(rèn)情況30分服務(wù)器自動回收

3.2 修改session回收時間

3.3 全局修改session有效時間

3.4.手動銷毀session對象

void invalidate()? ? : 銷毀session對象

4)如何避免瀏覽器的JSESSIONID的cookie隨著瀏覽器關(guān)閉而丟失的問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容