JAVAEE——Cookie&Session會話

會話技術(shù)

從打開一個瀏覽器訪問某個站點馆类,到關(guān)閉這個瀏覽器的整個過程逗威,成為一次會話。會話技術(shù)就是記錄這次會話中客戶端的狀態(tài)與數(shù)據(jù)的。
會話技術(shù)分為Cookie和Session:

  • Cookie:數(shù)據(jù)存儲在客戶端本地京革,減少服務(wù)器端的存儲的壓力,安全性不好冠跷,客戶端 可以清除cookie
  • Session:將數(shù)據(jù)存儲到服務(wù)器端合是,安全性相對好,增加服務(wù)器的壓力

功能

在一次會話的范圍內(nèi)的多次請求間飒赃,共享數(shù)據(jù)

方式

  1. 客戶端會話技術(shù):Cookie
  2. 服務(wù)器端會話技術(shù):Session

Cookie——客戶端會話技術(shù)

Cookie技術(shù)是將用戶的數(shù)據(jù)存儲到客戶端的會話技術(shù)利花,我們分為兩方面學(xué)習(xí):

  • 第一,服務(wù)器端怎樣將一個Cookie發(fā)送到客戶端
  • 第二载佳,服務(wù)器端怎樣接受客戶端攜帶的Cookie


    cookie的購物.png

基本使用

  1. 創(chuàng)建Cookie對象炒事,綁定數(shù)據(jù)

new Cookie(String name,String value)

  1. 發(fā)送Cookie對象

response.addCookie(Cookie cookie)

  1. 獲取Cookie,拿到數(shù)據(jù)

Cookie[] request.getCookies()

服務(wù)器端向客戶端發(fā)送一個Cookie

創(chuàng)建Cookie:

Cookie cookie = new Cookie(String cookieName,String cookieValue);
示例:
Cookie cookie = new Cookie("username"蔫慧,"zhangsan");
那么該cookie會以響應(yīng)頭的形式發(fā)送給客戶端:

//1挠乳、創(chuàng)建cookie對象
        Cookie cookie = new Cookie("name","zhangsan");
        
        //1.1 為cookie設(shè)置持久化時間 ---- cookie信息在硬盤上保存的時間
        cookie.setMaxAge(10*60);//10分鐘 ---- 時間設(shè)置為0代表刪除該cookie
        //1.2 為cookie設(shè)置攜帶的路徑
        //cookie.setPath("/WEB16/sendCookie");//訪問sendCookie資源時才攜帶這個cookie
        cookie.setPath("/WEB16");//訪問WEB16下的任何資源時都攜帶這個cookie
        //cookie.setPath("/");//訪問服務(wù)器下的所有的資源都攜帶這個cookie
        
        //2、將cookie中存儲的信息發(fā)送到客戶端---頭
        response.addCookie(cookie);
圖片.png

設(shè)置Cookie在客戶端的持久化時間:

cookie.setMaxAge(int seconds); ---時間秒

注意:
如果不設(shè)置持久化時間姑躲,cookie會存儲在瀏覽器的內(nèi)存中睡扬,瀏覽器關(guān)閉cookie信息銷毀(會話級別的cookie),如果設(shè)置持久化時間肋联,cookie信息會被持久化到瀏覽器的磁盤文件里
示例:

cookie.setMaxAge(10*60);
設(shè)置cookie信息在瀏覽器的磁盤文件中存儲的時間是10分鐘威蕉,過期瀏覽器自動刪除該cookie信息

參數(shù)意義:
1 正數(shù):將cookie數(shù)據(jù)寫到硬盤的文件中。持久化存儲
2 負(fù)數(shù):默認(rèn) 瀏覽器關(guān)閉即銷毀
3 零:刪除cookie信息

Cookie共享問題

  • 假設(shè)在一個tomcat服務(wù)器中橄仍,部署了多個web項目韧涨,那么在這個服務(wù)器中這些web項目cookie能不能共享?
    • 默認(rèn)情況下cookie不能共享
    • setPath(String path) 設(shè)置cookie的獲取范圍 默認(rèn)情況下侮繁,設(shè)置當(dāng)前虛擬目錄

Cookie的特點和作用

  1. cookie是存儲在客戶端
  2. 瀏覽器對于單個cookie的大小有限制(4kb)以及對同一個域名下的總cookie數(shù)量也有限制

Cookie存中文問題

  • tomcat7前不支持 需要使用URL編碼
  • tomcat8 支持中文 特殊字符需要使用URL編碼

作用

  1. cookie一般用于存儲少量的不太敏感的數(shù)據(jù)

設(shè)置Cookie的攜帶路徑:

cookie.setPath(String path);

注意:如果不設(shè)置攜帶路徑虑粥,那么該cookie信息會在訪問產(chǎn)生該cookie的web資源所在的路徑都攜帶cookie信息
示例:

cookie.setPath("/WEB16");
代表訪問WEB16應(yīng)用中的任何資源都攜帶cookie

cookie.setPath("/WEB16/cookieServlet");
代表訪問WEB16中的cookieServlet時才攜帶cookie信息

向客戶端發(fā)送cookie:

response.addCookie(Cookie cookie);

刪除客戶端的cookie:

如果想刪除客戶端的已經(jīng)存儲的cookie信息,那么就使用同名同路徑的持久化時 間為0的cookie進行覆蓋即可
步驟

  • 置空cookie的值
  • 設(shè)置相同path path不同代表不同的cookie
  • 設(shè)置cookie的時間為0
  • 發(fā)送cookie到客戶端
    //刪除客戶端保存 name=zhangsan的cookie信息
        Cookie cookie = new Cookie("name","");
        //將path設(shè)置成與要刪除cookie的path一致
        cookie.setPath("/WEB16");
        //設(shè)置時間是0
        cookie.setMaxAge(0);
        
        response.addCookie(cookie);

服務(wù)器端怎么接受客戶端攜帶的Cookie

cookie信息是以請求頭的方式發(fā)送到服務(wù)器端的:


圖片.png
//獲得客戶端攜帶的cookie的數(shù)據(jù)
        Cookie[] cookies = request.getCookies();
        //Cookie cookie = new Cookie("name","zhangsan");
        //通過cookie名稱獲得想要的cookie
        if(cookies!=null){
            for(Cookie cookie : cookies){
                //獲得cookie的名稱
                String cookieName = cookie.getName();
                if(cookieName.equals("name")){
                    //獲得該cookie的值
                    String cookieValue = cookie.getValue();
                    System.out.println(cookieValue);
                }
            }
        }

1)通過request獲得所有的Cookie:

Cookie[] cookies = request.getCookies();

遍歷Cookie數(shù)組宪哩,通過Cookie的名稱獲得我們想要的Cookie

  //獲取cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("name")) {
                String value = cookie.getValue();//獲取對應(yīng)name的cookie的值
                int maxAge = cookie.getMaxAge();//獲取對應(yīng)name的cookie的有效時間
                String path = cookie.getPath();//獲取對應(yīng)name的cookie的路徑
            }
        }

Session技術(shù) 服務(wù)器端會話技術(shù)

Session技術(shù)是將數(shù)據(jù)存儲在服務(wù)器端的技術(shù)
服務(wù)器會為每個客戶端都創(chuàng)建一塊內(nèi)存空間存儲客戶的數(shù)據(jù)娩贷,但客戶端需要每次都攜帶一個標(biāo)識ID去服務(wù)器中尋找屬于自己的內(nèi)存空間。所以說Session的實現(xiàn)是基于Cookie锁孟,Session需要借助于Cookie存儲客 戶的唯一性標(biāo)識JSESSIONID

session.png

獲得Session對象

HttpSession session = request.getSession();

此方法會獲得專屬于當(dāng)前會話的Session對象彬祖,如果服務(wù)器端沒有該會話的Session 對象會創(chuàng)建一個新的Session返回茁瘦,如果已經(jīng)有了屬于該會話的Session直接將已有的Session返回(實質(zhì)就是根據(jù)JSESSIONID判斷該客戶端是否在服務(wù)器上已經(jīng)存在session了)
一個客戶端在服務(wù)器只能創(chuàng)建一個session

服務(wù)器如何確保在一次會話范圍內(nèi) 多次獲取的session對象是同一個對象?
Seesion的實現(xiàn)是依賴于Cookie的

session域.png

怎樣向session中存取數(shù)據(jù)(session也是一個域?qū)ο螅?/h2>

Session也是存儲數(shù)據(jù)的區(qū)域?qū)ο蟠⑿Γ詓ession對象也具有如下三個

方法:

  • session.setAttribute(String name,Object obj);
  • session.getAttribute(String name);
  • session.removeAttribute(String name);

Session的細(xì)節(jié)

  • 當(dāng)客戶端關(guān)閉甜熔,服務(wù)器不關(guān)閉 獲取的Session是同一個嗎?
    默認(rèn)情況下不是突倍,可以創(chuàng)建Cookie指定JSESSIONID 來使得Session相同
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60*60);
response.addCookie(cookie);
  • 當(dāng)客戶端關(guān)閉腔稀,服務(wù)器關(guān)閉,兩次獲取的Session是同一個嗎羽历?
    服務(wù)器關(guān)閉后焊虏,內(nèi)存釋放,存儲在服務(wù)器端的session也會被銷毀秕磷,所以兩次獲取的Session不是同一個
    但是我們應(yīng)該確保數(shù)據(jù)不丟失
    • session的鈍化:
      • 在服務(wù)器正常關(guān)閉之前诵闭,將session對象序列化到硬盤上
    • session的活化:
      • 在服務(wù)器啟動后,將session文件轉(zhuǎn)化為內(nèi)存中的session對象即可
  • Session的失效時間

Session對象的生命周期

創(chuàng)建:第一次執(zhí)行request.getSession()時創(chuàng)建
銷毀:

  1. 服務(wù)器(非正常)關(guān)閉時
  2. session過期/失效(默認(rèn)30分鐘)
  3. session調(diào)用invalidate() 自我銷毀

問題:時間的起算點 從何時開始計算30分鐘跳夭?
從不操作服務(wù)器端的資源開始計時

可以在工程的web.xml中進行配置

<session-config>
        <session-timeout>30</session-timeout>
</session-config>

手動銷毀session

session.invalidate();

作用范圍:
默認(rèn)在一次會話中涂圆,也就是說在们镜,一次會話中任何資源公用一個session對象

瀏覽器關(guān)閉币叹,session就銷毀了? 不對

Seesion的特點

  1. session用于存儲一次會話的多次請求數(shù)據(jù)模狭,存在服務(wù)器端
  2. session可以存儲任意類型颈抚,任意大小的數(shù)據(jù)

session與cookie的區(qū)別

  1. session存儲數(shù)據(jù)在服務(wù)器端 cookie在客戶端
  2. session沒有數(shù)據(jù)大小的限制,cookie有
  3. session數(shù)據(jù)安全嚼鹉,cookie相對不安全
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贩汉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锚赤,更是在濱河造成了極大的恐慌匹舞,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件线脚,死亡現(xiàn)場離奇詭異赐稽,居然都是意外死亡,警方通過查閱死者的電腦和手機浑侥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門姊舵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寓落,你說我怎么就攤上這事括丁。” “怎么了伶选?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵史飞,是天一觀的道長尖昏。 經(jīng)常有香客問我,道長构资,這世上最難降的妖魔是什么会宪? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蚯窥,結(jié)果婚禮上掸鹅,老公的妹妹穿的比我還像新娘。我一直安慰自己拦赠,他們只是感情好巍沙,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荷鼠,像睡著了一般句携。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上允乐,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天矮嫉,我揣著相機與錄音,去河邊找鬼牍疏。 笑死蠢笋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鳞陨。 我是一名探鬼主播昨寞,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼厦滤!你這毒婦竟也來了援岩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤掏导,失蹤者是張志新(化名)和其女友劉穎享怀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趟咆,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡添瓷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忍啸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仰坦。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖计雌,靈堂內(nèi)的尸體忽然破棺而出悄晃,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布妈橄,位于F島的核電站庶近,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏眷蚓。R本人自食惡果不足惜鼻种,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沙热。 院中可真熱鬧叉钥,春花似錦、人聲如沸篙贸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爵川。三九已至敷鸦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寝贡,已是汗流浹背扒披。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留圃泡,地道東北人碟案。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像洞焙,于是被迫代替她去往敵國和親蟆淀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

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

  • 一澡匪、cookie機制和session機制的區(qū)別 具體來說cookie機制采用的是在客戶端保持狀態(tài)的方案,而sess...
    Rella7閱讀 4,710評論 0 7
  • 背景在HTTP協(xié)議的定義中褒链,采用了一種機制來記錄客戶端和服務(wù)器端交互的信息唁情,這種機制被稱為cookie,cooki...
    時芥藍(lán)閱讀 2,364評論 1 17
  • 1. cookie 1.1 什么是cookie cookie 是存儲于訪問者的計算機中的變量甫匹。每當(dāng)同一臺計算機通過...
    cbw100閱讀 4,059評論 0 13
  • 1甸鸟,國慶不回家 成長就是,你越來越發(fā)現(xiàn)兵迅,你離家越來越遠(yuǎn)抢韭,而且,你根本就回不去恍箭,回不去小時候那種相偎相依的感覺刻恭。 因...
    小仙女19號閱讀 102評論 5 1
  • 夢中, 你未見我 我未見你。 相隔八百里 搖曳的枝 細(xì)細(xì)的雨 還有那湖畔的弱柳招展 都是簌簌春風(fēng)起 緣起緣滅 云卷...
    墨染年華水閱讀 578評論 6 9