day11_會話管理

1課程回顧

Servlet編程

1)Servlet生命周期(重點)

構(gòu)造方法:創(chuàng)建servlet對象。默認情況下,第一次訪問servlet對象時。只調(diào)用1次。

init方法(有參):創(chuàng)建完servlet對象后調(diào)用。只調(diào)用1次。

注意:會調(diào)用無參的init方法。

service方法:servlet提供服務(wù)的方法。每次發(fā)出請求調(diào)用。

注意:request對象,response對象

destroy方法:tomcat服務(wù)器停止或web應(yīng)用重新部署,servlet對象銷毀,destroy方法被調(diào)用。

2)ServletConfig對象

獲取servlet的初始化參數(shù):

getInitParameter("name ");

getInitParameterNames();

3)ServletContext對象

得到web應(yīng)用路徑:

context.getContextPath();

request.getContextPath();等價于上面的代碼

得到web應(yīng)用參數(shù):

context.getInitParameter("name");

context.getInitParameterNames();

域?qū)ο?

context.setAttribute("name",Object):保存數(shù)據(jù)

context.getAttribute("name")得到數(shù)據(jù)

context.removeAttribue("name")清除數(shù)據(jù)

轉(zhuǎn)發(fā)

context.getRequestDispatcher("路徑").forward(request,response);

request.getRequestDispacher("路徑").forward(request,response);等價于上面的代碼

得到web應(yīng)用中的資源文件

context.getRealPath("路徑")

context.getResourceAsStream("路徑");

今天的目標(biāo):會話管理

2.會話管理入門

2.1生活中會話

我:小張,你會跳小蘋果碼?

小張:會,怎么了?

我:公司年會上要表演節(jié)目,你教教我把

小張:沒問題,一頓飯而已。

我:OK。

。。。。。。。。

在這次生活中的會話中產(chǎn)生通話記錄(會話數(shù)據(jù))

2.2軟件中的會話

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

登錄場景:

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

修改密碼(輸入原密碼)

修改收貨地址

.......

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

購物場景:

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

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

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

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

域?qū)ο螅簩崿F(xiàn)資源之間的數(shù)據(jù)共享。

request域?qū)ο?/p>

context域?qū)ο?/p>

登錄場景:

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

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

問題:context是所有用戶公有的資源!!!會覆蓋數(shù)據(jù)。

小張:輸入“張三”(保存數(shù)據(jù):request.setAttribute("name","張三"))- >用戶主頁(顯示“張三”)問題:一定要使用轉(zhuǎn)發(fā)技術(shù)來跳轉(zhuǎn)頁面!!!

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

2.3會話技術(shù)

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

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

3 Cooke技術(shù)

3.1特點

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

3.2 Cookie技術(shù)核心

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

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

Cookie(java.lang.String name, java.lang.String value)

2)設(shè)置cookie

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到瀏覽器端保存

void response.addCookie(Cookie cookie)? :發(fā)送cookie

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

Cookie[] request.getCookies()? :接收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的細節(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ù)值表示保存的時間。

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

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

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

3.5案例-顯示用戶上次訪問的時間

3.6案例-查看用戶瀏覽器過的商品

4 Session技術(shù)

4.1引入

Cookie的局限:

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

2)只能存非中文。

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

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

Session特點:

會話數(shù)據(jù)保存在服務(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ù)

4.3 Session原理

問題:服務(wù)器能夠識別不同的瀏覽者!!!

現(xiàn)象:

前提:在哪個session域?qū)ο蟊4鏀?shù)據(jù),就必須從哪個域?qū)ο笕〕觯。。。?/p>

瀏覽器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,叫JSESSIONID

new 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細節(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默認情況30分服務(wù)器自動回收

3.2修改session回收時間

3.3全局修改session有效時間


1

3.4.手動銷毀session對象

void invalidate():銷毀session對象

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

/**

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

*/

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

c.setMaxAge(60*60);

response.addCookie(c);

總結(jié):

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

2)Cookie技術(shù):

new Cookie("name","value")

response.addCookie(coookie)

request.getCookies()

3)Session技術(shù)

request.getSession();

setAttrbute("name","會話數(shù)據(jù)");

getAttribute("會話數(shù)據(jù)")

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 2.1 軟件中的會話 一次會話: 打開瀏覽器 -> 訪問一些服務(wù)器內(nèi)容 -> 關(guān)閉瀏覽器 登錄場景: 打開瀏覽器 ...
    yangliangliang閱讀 392評論 0 0
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,367評論 11 349
  • 會話管理入門 軟件中的會話:一次會話: 打開瀏覽器 -> 訪問一些服務(wù)器內(nèi)容 -> 關(guān)閉瀏覽器登錄場景:打開瀏覽器...
    奮斗的老王閱讀 1,439評論 4 53
  • 絕命毒師,講述了一位普通的高中化學(xué)老師在得知自己身患絕癥之后,為了給家人留下財產(chǎn),而利用自己超凡的化學(xué)知識制造毒品...
    愛賞云閱讀 118評論 0 0
  • 文/尹伊兒 這個春天,我們幾個紅迷小伙伴們可算來到了夢寐已久的北京西城區(qū)大觀園。 一下車,我們迫不及待的鉆進園子里...
    尹伊兒閱讀 1,682評論 20 45