java-會(huì)話技術(shù)-session

引入

Cookie的局限:

  • 1)Cookie只能存字符串類型。不能保存對象
  • 2)只能存非中文。
  • 3)1個(gè)Cookie的容量不超過4KB。

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

Session特點(diǎn):** 會(huì)話數(shù)據(jù)保存在服務(wù)器端。(內(nèi)存中) **

Session技術(shù)核心

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

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

  • HttpSession getSession()

  • HttpSession getSession(boolean create)

  • 2)設(shè)置session對象

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

  • void invalidate() : 銷毀session對象

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

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

  • void setAttribute(String name, Object value) : 保存數(shù)據(jù)

  • Object getAttribute(String name) : 獲取數(shù)據(jù)

  • void removeAttribute(String name) : 清除數(shù)據(jù)

Session原理

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

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

  • 瀏覽器1:(給s1分配一個(gè)唯一的標(biāo)記:s001,把s001發(fā)送給瀏覽器)

    • 1)創(chuàng)建session對象,保存會(huì)話數(shù)據(jù)
      HttpSession session = request.getSession(); --保存會(huì)話數(shù)據(jù) s1
      瀏覽器1 的新窗口(帶著s001的標(biāo)記到服務(wù)器查詢,s001->s1,返回s1)
    • 2)得到session對象的會(huì)話數(shù)據(jù)
      HttpSession session = request.getSession(); --可以取出 s1
  • 新的瀏覽器1:(沒有帶s001,不能返回s1)

    • 1)得到session對象的會(huì)話數(shù)據(jù)
      HttpSession session = request.getSession(); --不可以取出 s2
  • 瀏覽器2:(沒有帶s001,不能返回s1)

    • 1)得到session對象的會(huì)話數(shù)據(jù)
      HttpSession session = request.getSession(); --不可以取出 s3

代碼解讀:
** HttpSession session = request.getSession(); **

  • 1)第一次訪問創(chuàng)建session對象,給session對象分配一個(gè)唯一的ID,叫JSESSIONID

new HttpSession();

  • 2)把JSESSIONID作為Cookie的值發(fā)送給瀏覽器保存

        Cookie cookie = new Cookie("JSESSIONID", sessionID);
        response.addCookie(cookie);
    

* 3)第二次訪問的時(shí)候,瀏覽器帶著JSESSIONID的cookie訪問服務(wù)器

* 4)服務(wù)器得到JSESSIONID,在服務(wù)器的內(nèi)存中搜索是否存放對應(yīng)編號的session對象。

if(找到){
return map.get(sessionID);
}

Map<String,HttpSession>]
<"s001", s1>
<"s001,"s2>


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

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


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

---

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

* 1)String getId() : 得到session編號 (相當(dāng)于key)

* 2)兩個(gè)getSession方法:

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

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

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

* session對象銷毀時(shí)間:
  * 3.1 默認(rèn)情況30分服務(wù)器自動(dòng)回收
  * 3.2 修改session回收時(shí)間
  * 3.3 全局修改session有效時(shí)間

    ```
      <!-- 修改session全局有效時(shí)間:分鐘 -->
      <session-config>
      <session-timeout>1</session-timeout>
      </session-config>
      
    ```

  * 3.4.手動(dòng)銷毀session對象
void invalidate() : 銷毀session對象

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

// 手動(dòng)發(fā)送一個(gè)硬盤保存的cookie給瀏覽器
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);


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

* 2)Cookie技術(shù):

* new Cookie("name","value")
* response.addCookie(coookie)
* request.getCookies()

* 3)Session技術(shù)

* request.getSession();
* setAttrbute("name","會(huì)話數(shù)據(jù)");
* getAttribute("會(huì)話數(shù)據(jù)")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 2.1 軟件中的會(huì)話 一次會(huì)話: 打開瀏覽器 -> 訪問一些服務(wù)器內(nèi)容 -> 關(guān)閉瀏覽器 登錄場景: 打開瀏覽器 ...
    yangliangliang閱讀 392評論 0 0
  • 會(huì)話管理入門 軟件中的會(huì)話:一次會(huì)話: 打開瀏覽器 -> 訪問一些服務(wù)器內(nèi)容 -> 關(guān)閉瀏覽器登錄場景:打開瀏覽器...
    奮斗的老王閱讀 1,439評論 4 53
  • 1課程回顧 Servlet編程 1)Servlet生命周期(重點(diǎn)) 構(gòu)造方法:創(chuàng)建servlet對象。默認(rèn)情況下,...
    守亭翁閱讀 215評論 0 0
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,367評論 11 349
  • 姓名:顧君 單位:寧波大發(fā)化纖有限公司 學(xué)習(xí)組:第234期努力一組 【日精進(jìn)打卡第151天】 【知~學(xué)習(xí)】 《六項(xiàng)...
    JASONGU_2f28閱讀 142評論 0 0