JSP 會話管理

本文包括:

  1. HttpSession對象

  2. session內(nèi)置對象

  3. 使用session實現(xiàn)訪問控制

  4. JSP作用域

  5. Cookie

  6. session與Cookie的比較

  7. 小試牛刀:簡化用戶登錄


會話:當(dāng)前瀏覽器與服務(wù)器間多次的請求、響應(yīng)關(guān)系醇份,被稱作一個會話

1留量、HttpSession對象

1.1、HttpSession對象簡介

  • 服務(wù)器為每個會話創(chuàng)建一個HttpSession對象

  • 每個會話對象都有一個唯一的ID

  • 把用戶的數(shù)據(jù)保存在相應(yīng)的HttpSession對象內(nèi)

  • 第一次請求時赡勘,服務(wù)器創(chuàng)建一個HttpSession對象嫂便,并把該對象的ID返回給用戶。同時闸与,服務(wù)器在內(nèi)存中開辟一空間毙替,用來保存該對象數(shù)據(jù)。

  • 第二次請求把ID一起發(fā)送給服務(wù)器践樱,服務(wù)器根據(jù)ID號尋找內(nèi)存中相應(yīng)的數(shù)據(jù)厂画。

1.2、HttpSession對象的存在周期

  • session的創(chuàng)建

    瀏覽器訪問服務(wù)器時拷邢,服務(wù)器為每個瀏覽器創(chuàng)建不同的session對象

    嚴(yán)格描述:

    當(dāng)服務(wù)器端調(diào)用 HttpServletRequest.getSession() 時袱院,沒有當(dāng)前session,這時候才會創(chuàng)建一個session對象瞭稼,注意忽洛,JSP本質(zhì)是Servelt, JSP 文件在編譯成 Servlet 時將會自動加上這樣一條語句:

    HttpSession session = HttpServletRequest.getSession(true);

    這也是 JSP 中隱含的 session 對象的來歷环肘。

  • session的關(guān)閉

    1. 調(diào)用session. invalidate()方法欲虚,使session對象失效。

    2. 訪問時間間隔大于非活動時間間隔廷臼, session對象失效苍在。

      換種說法:

      Session 超時:超時指的是連續(xù)一定時間服務(wù)器沒有收到該 Session 所對應(yīng)客戶端的請求绝页,并且這個時間超過了服務(wù)器設(shè)置的 Session 超時的最大時間。

    3. 關(guān)閉服務(wù)器時寂恬,session對象失效

    注意:關(guān)閉瀏覽器時续誉,session對象不會馬上失效

原始出處:深入理解 HTTP Session

2初肉、session內(nèi)置對象

2.1酷鸦、session內(nèi)置對象簡介

  1. session表示客戶端與服務(wù)器的一次會話

  2. Web中的session指:用戶在瀏覽某個網(wǎng)站時,從進入網(wǎng)站到瀏覽器關(guān)閉所經(jīng)過的這段時間牙咏,也就是用戶瀏覽網(wǎng)站所花費的時間臼隔。

  3. 從上述定義中可以看到,session實際是一個【特定的時間概念】

  4. 服務(wù)器的內(nèi)存中妄壶,保存著同用戶的session摔握。

2.2、內(nèi)置對象session的常用方法

  • void setAttribute(String key,Object value):以key/value的形式保存對象值

  • Object getAttribute(String key):通過key獲取對象值

  • void invalidate():設(shè)置session對象失效

  • String getId():獲取sessionid

  • void setMaxInactiveInterval(int interval):設(shè)定session的非活動時間

  • int getMaxInactiveInterval():獲取session的有效非活動時間(以秒為單位)

  • void removeAttribute(String key):從session中刪除指定名稱(key)所對應(yīng)的對象

2.3丁寄、session與窗口的關(guān)系

  • 每個session對象都與瀏覽器一一對應(yīng)氨淌,重新開啟一個瀏覽器,相當(dāng)于重新創(chuàng)建一個session對象伊磺。

  • 通過超鏈接打開的新窗口盛正,新窗口的session與其父窗口的session相同

3、使用session實現(xiàn)訪問控制

3.1屑埋、需求說明:

  • 新聞發(fā)布系統(tǒng)只允許管理員能夠進入后臺操作頁面

  • 普通用戶只有瀏覽新聞和發(fā)布評論的權(quán)限

3.2豪筝、業(yè)務(wù)分析:

  1. 登錄處理頁面

  2. 獲得登錄信息

  3. 查詢數(shù)據(jù)庫,判斷該用戶是否注冊

  4. 如果該用戶已注冊摘能,在session中保存該用戶的登錄信息

  5. 如果用戶是管理員就跳轉(zhuǎn)到管理員界面续崖;否則跳轉(zhuǎn)到新聞發(fā)布系統(tǒng)的首頁。

  6. 管理員界面

    • 從session中提取該用戶信息

    • 如果用戶信息存在徊哑,顯示管理員界面內(nèi)容

    • 如果用戶信息不存在袜刷,跳轉(zhuǎn)到登錄頁面

3.3聪富、代碼實現(xiàn):

  1. 在控制頁面獲取用戶請求的登錄信息進行驗證

     <%
     if ("admin".equals(name)&&"admin".equals(pwd){  //如果是已注冊用戶
         //在session中存放用戶登錄信息    
         session.setAttribute("login", name);
         //設(shè)置session過期時間
         session.setMaxInactiveInterval(10*60);
         //請求轉(zhuǎn)發(fā)
         request.getRequestDispatcher("admin.jsp") .forward(request,response);
     } else {
     response.sendRedirect("index.jsp");}
     %>
    
  2. 在新聞發(fā)布系統(tǒng)新聞發(fā)布頁面增加登錄驗證

     <%
     //session.getAttribute(String key)方法的返回值是一個Object莺丑,必須進行強制類型轉(zhuǎn)換
     String login = (String) session.getAttribute("login");
         if (login == null){
             //如果session中不存在該用戶的登錄信息,轉(zhuǎn)入登錄頁面
             response.sendRedirect("index.jsp");
     } %>    
    

3.4墩蔓、優(yōu)化訪問控制:

  1. 除了首頁面梢莽,其它頁面中同樣需要加入登錄驗證,有沒有辦法避免冗余代碼的出現(xiàn)奸披?可以將一些共性的內(nèi)容寫入一個單獨的文件中昏名,然后通過include指令引用該文件。

  2. 創(chuàng)建登錄驗證文件 loginControl.jsp

     <%
     String login = (String) session.getAttribute("login");
     if (login == null)
       response.sendRedirect("index.jsp");
     %>
    

    在后臺首頁面中使用include指令引用登錄驗證文件

     <%@ include file="loginControl.jsp"    %>
    

    注意:重復(fù)定義變量阵面。

4轻局、JSP作用域

作用域:信息共享的范圍

4.1洪鸭、常用作用域存/取值方法

  • setAttribute(String key,Object value):采用鍵/值對方式在當(dāng)前作用域中儲存數(shù)據(jù)

  • getAttribute(String key):以鍵(key)方式取出當(dāng)前作用域儲存的值

4.2、內(nèi)置對象名稱

  1. page作用域指本JSP頁面的范圍

    • pageContext.setAttribute(鍵,值)

    • pageContext.getAttribute(鍵)

  2. request作用域內(nèi)的對象則是與客戶端的請求綁定在一起

  3. session對象作用域:一次會話

  4. application的作用域:面對整個Web應(yīng)用程序

5仑扑、cookie

cookie是Web服務(wù)器保存在客戶端的一系列文本信息

5.1览爵、cookie的作用:

  1. 對特定對象的追蹤
  1. 統(tǒng)計網(wǎng)頁瀏覽次數(shù)
  1. 簡化登錄

5.2、安全性能:容易信息泄露

5.3镇饮、語法:

  • 創(chuàng)建cookie對象

      Cookie newCookie = new Cookie(String key,String value);
    
  • 寫入cookie

      response.addCookie(newCookie);
    
  • 讀取cookie

      Cookie[] cookies = request.getCookies();
    

5.4蜓竹、常用方法:

  • void setMaxAge(int expiry):設(shè)置cookie的有效期,以秒為單位

  • void setValue(String value):在cookie創(chuàng)建后储藐,對cookie進行賦值

  • String getName():獲取cookie的名稱

  • String getValue():獲取cookie的值

5.5俱济、Cookie的中文傳值問題

  • 解答:

    Version 0 cookie values are restrictive in allowed characters. It only allows URL-safe characters. This covers among others the alphanumeric characters (a-z, A-Z and 0-9) and only a few lexical characters, including -, _, ., ~ and %. All other characters are invalid in version 0 cookies.

    Your best bet is to URL-encode those characters. This way every character which is not allowed in URLs will be percent-encoded in this form %xx which is valid as cookie value.

    So, when creating the cookie do:

    Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
    // ...
    And when reading the cookie, do:

    String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
    // ...

  • 具體做法:

    在JSP文件中

      <%@page import="java.net.URLEncoder"%>
    
      ...
    
      //創(chuàng)建Cookie時
      Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
      
      ...
    
      //讀取Cookie時    
      String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
    

6、session與cookie的比較

  • session是在服務(wù)器端保存用戶信息钙勃,Cookie是在客戶端保存用戶信息

  • session中保存的是對象蛛碌,Cookie保存的是字符串

  • session隨會話結(jié)束而關(guān)閉,Cookie可以長期保存在客戶端

  • 不重要的信息使用cookie保存辖源,重要的信息使用session保存

7左医、小試牛刀:簡化用戶登錄

7.1、需求說明:

  • 用戶第一次登錄時需要輸入用戶名和密碼

  • 在5分鐘內(nèi)同木,無需再次登錄則直接顯示歡迎頁面

7.2浮梢、實現(xiàn)思路:

  1. 用戶登錄后,創(chuàng)建cookie保存用戶信息

  2. 設(shè)置cookie的有效期為5分鐘

  3. 在登錄頁循環(huán)遍歷cookie數(shù)組彤路,判斷是否存在指定名稱的cookie秕硝,若存在則直接跳轉(zhuǎn)至歡迎頁面

提示:使用setMaxAge(5*60)設(shè)置cookie的有效期

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洲尊,隨后出現(xiàn)的幾起案子远豺,更是在濱河造成了極大的恐慌,老刑警劉巖坞嘀,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躯护,死亡現(xiàn)場離奇詭異,居然都是意外死亡丽涩,警方通過查閱死者的電腦和手機棺滞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矢渊,“玉大人继准,你說我怎么就攤上這事“校” “怎么了移必?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長毡鉴。 經(jīng)常有香客問我崔泵,道長秒赤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任憎瘸,我火速辦了婚禮倒脓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘含思。我一直安慰自己崎弃,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布含潘。 她就那樣靜靜地躺著饲做,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遏弱。 梳的紋絲不亂的頭發(fā)上盆均,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音漱逸,去河邊找鬼泪姨。 笑死,一個胖子當(dāng)著我的面吹牛饰抒,可吹牛的內(nèi)容都是我干的肮砾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼袋坑,長吁一口氣:“原來是場噩夢啊……” “哼仗处!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枣宫,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤婆誓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后也颤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洋幻,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年翅娶,在試婚紗的時候發(fā)現(xiàn)自己被綠了文留。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡故觅,死狀恐怖厂庇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情输吏,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布替蛉,位于F島的核電站贯溅,受9級特大地震影響拄氯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜它浅,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一译柏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姐霍,春花似錦鄙麦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恨胚,卻和暖如春骂因,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赃泡。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工寒波, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人升熊。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓俄烁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親级野。 傳聞我的和親對象是個殘疾皇子猴娩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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