web會話跟蹤:cookie和session

什么是會話?
web語言中的會話

web會話可簡單理解為:用戶開一個瀏覽器,訪問某一個web站點,在這個站點點擊多個超鏈接,訪問服務器多個web資源宋舷,然后關(guān)閉瀏覽器,整個過程稱之為一個會話瓢姻。

由于HTTP是一種無狀態(tài)協(xié)議祝蝠,每當用戶發(fā)出請求時,服務器就會做出響應汹来,但是一個請求結(jié)束時 , 服務器就會忘掉這個會話 , 當用戶在同一網(wǎng)站的多個頁面之間轉(zhuǎn)換時续膳,根本無法確定是否是同一個客戶

如現(xiàn)在要寫一個郵箱管理系統(tǒng),當?shù)卿洝D(zhuǎn)頁面之后,此時不知道是哪個賬戶登錄了
解決方案:


1. 使用參數(shù)的傳遞機制,在每一個請求之間使用參數(shù)來傳遞需要共享的數(shù)據(jù).

LoginServlet.java:
out.print("<a href='/param/list?username="+username+"'>收件箱</a>");
ListServlet.java:
out.print("<a href='/param/get?username="+username+"'>一封郵件</a><br/>");
GetServlet.java:
out.println("歡迎:" + username + "<br/>");





這種方法可以解決問題
但是因為數(shù)據(jù)在請求行中
請求需要共享的數(shù)據(jù)會全部暴露在瀏覽器的地址欄中,不安全.
所以應該把共享數(shù)據(jù)存放到請求頭中,此時就不會在瀏覽器地址欄出現(xiàn)了→cookie


2. cookie

cookie是客戶端技術(shù),程序把每個用戶的數(shù)據(jù)以cookie的形式寫給用戶各自的瀏覽器,當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶著各自的數(shù)據(jù)去訪問.

cookie相關(guān)方法&屬性:

(1) 創(chuàng)建cookie對象

/**
* @param name<String>當前該Cookie取的一個唯一的名字
* @param value<String>存儲在Cookie中的共享數(shù)據(jù),只能是String類型
*/
Cookie cookie = new Cookie(String name,String value);

(2) 把cookie放入響應中,響應給瀏覽器,value會儲存在瀏覽器中
response.addCookie(cookie);

(3) 獲取cookie以及獲取cookie中的數(shù)據(jù)

  • cookie存在于請求頭中,所以應該用request來獲取
    Cookie[] cs = req.getCookies();
  • 獲取當前cookie的key:String name = cookie對象.getName();
  • 獲取當前cookie的value:String value = cookie對象.getValue();

(4) cookie中文的問題

cookie中,屬性名和屬性值都不能使用中文,需要使用編碼解碼解決問題

String info = "我是XiaoA";
//       編碼
        String ret = URLEncoder.encode(info,"utf-8");
//        解碼
        String str = URLEncoder.encode(ret,"utf-8");

(5) 修改Cookie中指定屬性名的屬性值
例如修改Cookie c1 = new cookie("username","ZhangSan");

  • 方式1: 創(chuàng)建一個同名的新的cookie,覆蓋
Cookie c2 = new Cookie("username","xiaoA")
response.addCookie(c);
  • 方式2:
c1.setValue("XiaoA");
response.addCookie(c2);

(6) cookie的分類(會話cookie和持久化cookie)

  • 會話cookie : 關(guān)閉瀏覽器之后 , cookie就銷毀了 , 默認缺省
  • 持久化cookie : cookie可以保存指定的時間段
    設置存活時間:cookie對象.setMaxAge(int seconds)
    second==0 : 刪除cookie;
    second < 0 : 會話cookie;
    second > 0 : 存活秒數(shù).

(7) cookie的域

  • cookie是在同一主機中指定共享cookie,如果主機不同就一定不能共享cookie
  • 如果希望不同的二級域名可以共享cookie(例如music.baidu.com , tieba.baidu.com共享一個session),那么就要設置path和domain了.
    ①設置cookie的path為"/"cookie.setPath("/"),這樣在整個xx.baidu.com中都能傳遞
    ②設置cookie的domaincookie.setDomain(".baidu.com"),此時沒有指定domain前綴,在music.baidu.com中保存了cookie,在tieba.baidu.com中獲取cookie.(當然這需要配置兩個虛擬主機才行,二級域名配置虛擬主機即可.)
  • servlet1("/cookie/login") , servlet2("/else/123")
    此時servlet1不會發(fā)送請求給servlet2的,路徑不同,只會把cookie傳給以/cookie打頭的資源.
cookie的缺陷:

(1) 前端可以直接查看瀏覽器的cookie,不安全
(2) cookie存儲中文麻煩
(3) cookie的value是String類型,一個Cookie只能存儲一個數(shù)據(jù),如果要存儲n個數(shù)據(jù)就要n個cookie
(4) 站點對cookie有限制 : ①cookie大小限制在4KB之內(nèi) ②一臺服務器在一個客戶端最多保存20個cookie ③一個瀏覽器最多可以保存300個cookie
(5) 設計不太符合現(xiàn)實 : 不能單單把cookie作為兩端交互的憑證 , 在生活中 , 是把識別數(shù)據(jù)的實現(xiàn)放在服務端

→session


3. session

session是服務端技術(shù),利用這個技術(shù),服務器在運行時可以為每一個用戶的瀏覽器創(chuàng)建一個獨享的session對象,由于session為用戶瀏覽器獨享,所以在訪問服務器的web資源時,可以把各自的數(shù)據(jù)放在各自的session中,當用戶再去訪問服務器中的其他資源時,其他web資源再從用戶各自的session中取出數(shù)據(jù)為用戶服務.

session本質(zhì)就是一個會話cookie,在瀏覽器關(guān)閉時清掉內(nèi)存cookie與相應的sessionid
session對比

cookie相關(guān)方法&屬性:

(1) 創(chuàng)建和獲取session對象

  • HttpSession session = request.getSession(true);
    如果當前請求中存在一個session對象,就直接返回,如果不存在session對象,就先創(chuàng)建一個再返回.
  • HttpSession session = request.getSession(false);
    如果當前請求中存在一個session對象,就直接返回,如果不存在session對象,就返回null.
  • HttpSession session = request.getSession();等價于HttpSession session = request.getSession(true);

(2) session存儲數(shù)據(jù)
session對象.setAttribute(String name,Object value);

(3) session取數(shù)據(jù)
Object value = session對象.getAttribute(String key);

(4) 刪除session(用戶注銷登錄)

  • 刪除session中指定屬性名的值
    session對象.removeAttribute("username");
  • 銷毀session對象
    session對象.invalidate();

(5)session超時管理
在超時時間內(nèi),如果客戶端和服務器沒有交互(用戶兩次操作之間不超過該時間),則自動銷毀session
session對象.setMaxInterval(60*10);//10分鐘超時
tomcat服務器默認超時時間為30分鐘,不過一般20多分鐘就銷毀了

(6) url重寫
session是一種特殊的cookie,而瀏覽器可以禁用cookie.這樣cookie和session都會失效.
解決辦法 : 此時,需要在每一個資源之后,攜帶session的ID
這里提供了一個方法可以不手動去拼接';jsessionid='
使用response.encodeURL("/session/abc")即可,會自動在資源后拼接';jsessionid='
一般情況不這樣做 , 一般會檢查cookie是否打開 , 并提醒用戶打開

session注意點

(1) 一般的,存儲到session中的屬性名稱要唯一,我們習慣XXX_IN_SESSION:session對象.setAttribute("USER_IN _SESSION","XiaoA")
(2) value是Object類型,如果需要把多個數(shù)據(jù)存在session中,一般的,我們把數(shù)據(jù)封裝成一個對象,然后存儲到session中
(3) 如果多臺服務器之間需要共享session,此時session中的對象,必須實現(xiàn)java.io.serializable才能在網(wǎng)絡上傳輸

  • 序列化 : 把對象信息存儲為二進制
  • 反序列化 : 把二進制信息恢復成對象
    public class User implement java.io.serializable{......}

應用:

(1) 單點登錄
(2) 購物車
(3) 記錄登錄時間
(4) 永久登錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市收班,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谒兄,老刑警劉巖摔桦,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異承疲,居然都是意外死亡邻耕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門燕鸽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兄世,“玉大人,你說我怎么就攤上這事啊研∮玻” “怎么了鸥拧?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長削解。 經(jīng)常有香客問我富弦,道長,這世上最難降的妖魔是什么氛驮? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任腕柜,我火速辦了婚禮,結(jié)果婚禮上矫废,老公的妹妹穿的比我還像新娘盏缤。我一直安慰自己,他們只是感情好蓖扑,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布蛾找。 她就那樣靜靜地躺著,像睡著了一般赵誓。 火紅的嫁衣襯著肌膚如雪打毛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天俩功,我揣著相機與錄音幻枉,去河邊找鬼。 笑死诡蜓,一個胖子當著我的面吹牛熬甫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔓罚,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼椿肩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了豺谈?” 一聲冷哼從身側(cè)響起郑象,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茬末,沒想到半個月后厂榛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡丽惭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年击奶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片责掏。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡柜砾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出换衬,到底是詐尸還是另有隱情痰驱,我是刑警寧澤证芭,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站萄唇,受9級特大地震影響檩帐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜另萤,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一湃密、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧四敞,春花似錦泛源、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铺厨,卻和暖如春缎玫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背解滓。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工赃磨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洼裤。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓邻辉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腮鞍。 傳聞我的和親對象是個殘疾皇子值骇,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

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