session和cookie學習

1. session和cookie學習

1.1. 技術的需求

  • 以京東未登錄時添加購物車為例,在京東上購買東西(未登錄)可以添加到購物車徒恋,這時候有個問題是京東如何存儲沒有登錄的你添加的購物車物品?我們肯定想到域對象每聪,request忍法、ServletContext域對象
  • request對象有個問題:request是請求一次面粮,產生一次灾挨,如果繼續(xù)請求就會釋放掉邑退,也就是說request就有一個,就在本次請求中劳澄。這種特性顯然是不行的地技,因為假如你添加了一個物品進入購物車,然后添加另一個物品秒拔,這是第二個請求莫矗,就會將第一個請求給覆蓋掉。因此用request域對象來做購物車的添加是不可行的砂缩。
  • ServletContext域對象作谚,這個也有問題,這個對象是全局的梯轻,不管誰添加購物車食磕,都會集中在一起,在付賬時會發(fā)現你會付賬所有人添加的購物車喳挑,這顯然是不可取的。
  • 我們的需求是:當我們添加一個物品到購物車時,我們可以多次添加伊诵。也就是說由服務器給我們創(chuàng)造一個個人空間单绑,這就引出了另一個域對象session對象

1.2. 會話技術學習

  • 會話技術:從打開一個瀏覽器訪問某個站點開始,到關閉這個瀏覽器的整個過程曹宴,成為一次會話搂橙。會話技術就是記錄這次會話中客戶端的狀態(tài)與數據。
  • 會話技術分為兩種:cookie和session技術笛坦。cookie区转,數據存儲到客戶端本地,減少服務器存儲壓力版扩,安全性不好废离,客戶端可以清除cookie。session是將數據存儲到服務器礁芦,安全性高蜻韭,但是會增加服務器壓力。

1.3. cookie技術學習

  • 服務器怎樣將一個cookie寫入客戶端
  • 服務器怎樣獲取客戶端攜帶的cookie

1.3.1. 服務器向客戶端發(fā)送一個cookie

  1. 創(chuàng)建一個cookie對象
Cookie cookie=new Cookie(String name,String Value);
  1. 為cookie設置持久化時間-----cookie信息在硬盤上保存的時間,時間到cookie會自動刪除柿扣。如果不設置這個cookie就會存儲在內存中肖方,關閉瀏覽器cookie信息被清空了。
cookie.setMaxAge(60*10);//10分鐘
  1. 設置cookie攜帶路徑未状,如果不設置俯画,每次訪問將攜帶所有網站的cookie會影響瀏覽器速度。
cookie.setPath(String path);
cookie.setPath("/WEB16/sendCookie");//訪問sendCookie資源時才攜帶這個cookie
cookie.setPath("/WEB16");//訪問WEB16下的所有資源都可以攜帶cookie司草。

如果不設置攜帶路徑活翩,那么該cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie信息。

  1. 向客戶端發(fā)送cookie
response.addCookie(Cookie cookie);

1.3.2. 從客戶端獲取cookie

  1. 獲得客戶端攜帶的cookie數據翻伺,通過getCookies()方法
Cookies[] cookies=request.getCookies();
  1. 遍歷數組材泄,用equals()方法獲取想要的cookies
if(cookies!=null){//用數組判斷null可以 
            for(Cookie cookie:cookies){
            String cookieName=cookie.getName();
            if(cookieName.equals("name")){
                String cookieValue=cookie.getValue();
                System.out.println(cookieValue);
            }
        }
    }

1.4. 案例分析--通過Cookie獲取上次最后瀏覽時間

1.4.1. 向cookie中寫入最后一次瀏覽時間

  1. 獲取當前時間,并格式化時間
Date date =new Date();
SimpleDateFormat format=new SimpleDataFormat("yyyy-MM-dd hh:mm:ss");
String currentTime=format.format(date);//格式化當前的時間
  1. 創(chuàng)建cookie記錄最新的訪問時間
Cookie cookie=new Cookie("lastAccessTime",currentTime);
cookie.setMaxAge(60*10*500);//設置cookie存在時間
response.addConkie(cookie);//持久化cookie
  1. 從客戶端獲取cookie---lastAccessTime
String lastAccessTime=null;
//從request中獲取cookie
Cookie[] cookies=request.getCookies();
if(cookies!=null){
    for(Cookie coo:cookies){
        if("lastAccessTime".equals(coo.getName())){
            lastAccessTime=coo.getValue();
        }
    }
}

  1. 判斷是否為第一次問
response.setContextType("text/html,charset=UTF-8");
if(lastAccessTime==null){
    response.getWriter().write("您是第一次訪問");
}else{
    response.getWriter().write("您上次訪問的時間是:"+lastAccessTime);
}

1.5. Session技術

1.5.1. session技術的實現原理

  1. session技術是將數據存儲到服務器上吨岭,面臨的問題有如何知道存儲在服務器上的數據是你存儲的數據拉宗。
session域對象
  1. 由此可見session技術是基于cookie技術存儲session編號----JSESSISION。
  2. 給服務器創(chuàng)建屬于一個客戶端的session區(qū)域辣辫,
  3. 向session區(qū)域中存取數據

1.5.2. 創(chuàng)建session會話

  1. session屬于客戶端私有的session區(qū)域旦事,request.getSession()方法內部會自動判斷,該客戶端是否在服務器端已經存在session急灭,如果該客戶端在服務器上不存在session姐浮,那么就會創(chuàng)建一個新的session對象,如果該客戶端已經存在session就會該session
HttpSession session=request.getSession();
String id=session.getId();
response.getWriter().write("JESSIONID:"+id);//打印到瀏覽器上葬馋。
  1. 給session域中賦值
session.setAttribute("name","jerry");

1.5.3. 關于session會話技術的面試題

  1. 重定向和轉發(fā)的區(qū)別:

    • 重定向請求兩次卖鲤,轉發(fā)請求一次肾扰。
  2. session會話的聲明周期

    創(chuàng)建: 第一次執(zhí)行request.getSession()時創(chuàng)建。(服務器端在執(zhí)行到request.getSession()時會查看cookie是否有sessionId,有就獲取蛋逾,沒有就創(chuàng)建一個集晚。)

    銷毀: 1)服務器關閉時。2)session過期失效(默認30分鐘)可以在web.xml配置区匣。

    手動銷毀:session.invalidate();

    作用范圍:默認在一次會話中偷拔,也就是說在一次會話中,任何資源公用一個session對象亏钩。

  3. 瀏覽器關閉莲绰,session就銷毀了?

    不對,session域在服務器上姑丑,跟客戶端無關蛤签,默認30分鐘銷毀。

1.5.4. session的持久化技術

  1. session為什么要持久化彻坛?

    比如啟動一個瀏覽器顷啼,設置好參數后,關閉瀏覽器昌屉,重啟钙蒙,這些參數又丟失了。這不是很麻煩间驮?就比如未登錄的百度一樣躬厌,設置了瀏覽記錄不可見的參數,設置以后可以保證一段時間登陸百度看不到瀏覽記錄竞帽,但是一段時間過去后又出現了瀏覽記錄扛施,我認為這就用到了session持久化的技術,除此之外驗證碼的校驗也需要用到session技術,因為存放在request域中屹篓,一旦請求校驗疙渣,就會丟失,如果存儲在ServletContext()域中堆巧,就會成為全局的對象妄荔,整個登錄該網站的驗證碼都會被加載進去,這就不符合技術規(guī)范了谍肤,因此session域是適合的域啦租。

  2. session如何實現持久化?

    session持久化的實現靠的是cookie實現的荒揣。首先需要讓cookie能夠長期存儲session的id號篷角,那么就要設置cookie的存儲時間,因為cookie能存儲更長時間系任,關閉瀏覽器也不會立即消失恳蹲,就可以重新獲取cookie虐块。

String id=session.getId()//獲取session的id
Cookie cookie=new Cookie("JSESSIONID",id);//創(chuàng)建一個cookie,其中id為JSESSIONID
cookie.setPath("/WEB16/");//cookei的作用路徑,如果不設置會增加瀏覽器的壓力
cookie.setMaxAge(60*10);//給cookie設置存在時間
response.addCookie(cookie);//添加cookie到客戶端
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市阱缓,隨后出現的幾起案子非凌,更是在濱河造成了極大的恐慌举农,老刑警劉巖荆针,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異颁糟,居然都是意外死亡航背,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門棱貌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玖媚,“玉大人,你說我怎么就攤上這事婚脱〗衲В” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵障贸,是天一觀的道長错森。 經常有香客問我,道長篮洁,這世上最難降的妖魔是什么涩维? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮袁波,結果婚禮上瓦阐,老公的妹妹穿的比我還像新娘。我一直安慰自己篷牌,他們只是感情好睡蟋,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枷颊,像睡著了一般戳杀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偷卧,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天豺瘤,我揣著相機與錄音,去河邊找鬼听诸。 笑死坐求,一個胖子當著我的面吹牛,可吹牛的內容都是我干的晌梨。 我是一名探鬼主播桥嗤,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼须妻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泛领?” 一聲冷哼從身側響起荒吏,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渊鞋,沒想到半個月后绰更,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡锡宋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年儡湾,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片执俩。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡徐钠,死狀恐怖,靈堂內的尸體忽然破棺而出役首,到底是詐尸還是另有隱情尝丐,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布衡奥,位于F島的核電站爹袁,受9級特大地震影響,放射性物質發(fā)生泄漏杰赛。R本人自食惡果不足惜呢簸,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乏屯。 院中可真熱鬧根时,春花似錦、人聲如沸辰晕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽含友。三九已至替裆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窘问,已是汗流浹背辆童。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惠赫,地道東北人把鉴。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像儿咱,于是被迫代替她去往敵國和親庭砍。 傳聞我的和親對象是個殘疾皇子场晶,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容