溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

怎么學(xué)習(xí)并掌握session和cookie

發(fā)布時(shí)間:2021-11-03 18:00:55 來(lái)源:億速云 閱讀:145 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“怎么學(xué)習(xí)并掌握session和cookie”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么學(xué)習(xí)并掌握session和cookie”吧!

1. session和cookie學(xué)習(xí)

1.1. 技術(shù)的需求

  • 以京東未登錄時(shí)添加購(gòu)物車(chē)為例,在京東上購(gòu)買(mǎi)東西(未登錄)可以添加到購(gòu)物車(chē),這時(shí)候有個(gè)問(wèn)題是京東如何存儲(chǔ)沒(méi)有登錄的你添加的購(gòu)物車(chē)物品?我們肯定想到域?qū)ο?,request、ServletContext域?qū)ο?/p>

  • request對(duì)象有個(gè)問(wèn)題:request是請(qǐng)求一次,產(chǎn)生一次,如果繼續(xù)請(qǐng)求就會(huì)釋放掉,也就是說(shuō)request就有一個(gè),就在本次請(qǐng)求中。這種特性顯然是不行的,因?yàn)榧偃缒闾砑恿艘粋€(gè)物品進(jìn)入購(gòu)物車(chē),然后添加另一個(gè)物品,這是第二個(gè)請(qǐng)求,就會(huì)將第一個(gè)請(qǐng)求給覆蓋掉。因此用request域?qū)ο髞?lái)做購(gòu)物車(chē)的添加是不可行的。

  • ServletContext域?qū)ο?,這個(gè)也有問(wèn)題,這個(gè)對(duì)象是全局的,不管誰(shuí)添加購(gòu)物車(chē),都會(huì)集中在一起,在付賬時(shí)會(huì)發(fā)現(xiàn)你會(huì)付賬所有人添加的購(gòu)物車(chē),這顯然是不可取的。

  • 我們的需求是:當(dāng)我們添加一個(gè)物品到購(gòu)物車(chē)時(shí),我們可以多次添加。也就是說(shuō)由服務(wù)器給我們創(chuàng)造一個(gè)個(gè)人空間,這就引出了另一個(gè)域?qū)ο髎ession對(duì)象

1.2. 會(huì)話(huà)技術(shù)學(xué)習(xí)

  • 會(huì)話(huà)技術(shù):從打開(kāi)一個(gè)瀏覽器訪(fǎng)問(wèn)某個(gè)站點(diǎn)開(kāi)始,到關(guān)閉這個(gè)瀏覽器的整個(gè)過(guò)程,成為一次會(huì)話(huà)。會(huì)話(huà)技術(shù)就是記錄這次會(huì)話(huà)中客戶(hù)端的狀態(tài)與數(shù)據(jù)。

  • 會(huì)話(huà)技術(shù)分為兩種:cookie和session技術(shù)。cookie,數(shù)據(jù)存儲(chǔ)到客戶(hù)端本地,減少服務(wù)器存儲(chǔ)壓力,安全性不好,客戶(hù)端可以清除cookie。session是將數(shù)據(jù)存儲(chǔ)到服務(wù)器,安全性高,但是會(huì)增加服務(wù)器壓力。

1.3. cookie技術(shù)學(xué)習(xí)

  • 服務(wù)器怎樣將一個(gè)cookie寫(xiě)入客戶(hù)端

  • 服務(wù)器怎樣獲取客戶(hù)端攜帶的cookie

1.3.1. 服務(wù)器向客戶(hù)端發(fā)送一個(gè)cookie
  1. 創(chuàng)建一個(gè)cookie對(duì)象

1Cookie cookie=new Cookie(String name,String Value);
  1. 為cookie設(shè)置持久化時(shí)間-----cookie信息在硬盤(pán)上保存的時(shí)間,時(shí)間到cookie會(huì)自動(dòng)刪除。如果不設(shè)置這個(gè)cookie就會(huì)存儲(chǔ)在內(nèi)存中,關(guān)閉瀏覽器cookie信息被清空了。

1cookie.setMaxAge(60*10);//10分鐘
  1. 設(shè)置cookie攜帶路徑,如果不設(shè)置,每次訪(fǎng)問(wèn)將攜帶所有網(wǎng)站的cookie會(huì)影響瀏覽器速度。

1cookie.setPath(String path);
1cookie.setPath("/WEB16/sendCookie");//訪(fǎng)問(wèn)sendCookie資源時(shí)才攜帶這個(gè)cookie
1cookie.setPath("/WEB16");//訪(fǎng)問(wèn)WEB16下的所有資源都可以攜帶cookie。

如果不設(shè)置攜帶路徑,那么該cookie信息會(huì)在訪(fǎng)問(wèn)產(chǎn)生該cookie的web資源所在的路徑都攜帶cookie信息。

  1. 向客戶(hù)端發(fā)送cookie

1response.addCookie(Cookie cookie);
1.3.2. 從客戶(hù)端獲取cookie
  1. 獲得客戶(hù)端攜帶的cookie數(shù)據(jù),通過(guò)getCookies()方法

1Cookies[] cookies=request.getCookies();
  1. 遍歷數(shù)組,用equals()方法獲取想要的cookies

1if(cookies!=null){//用數(shù)組判斷null可以 2            for(Cookie cookie:cookies){3            String cookieName=cookie.getName();4            if(cookieName.equals("name")){5                String cookieValue=cookie.getValue();6                System.out.println(cookieValue);7            }8        }9    }

1.4. 案例分析--通過(guò)Cookie獲取上次最后瀏覽時(shí)間

1.4.1. 向cookie中寫(xiě)入最后一次瀏覽時(shí)間
  1. 獲取當(dāng)前時(shí)間,并格式化時(shí)間

1Date date =new Date();2SimpleDateFormat format=new SimpleDataFormat("yyyy-MM-dd hh:mm:ss");3String currentTime=format.format(date);//格式化當(dāng)前的時(shí)間
  1. 創(chuàng)建cookie記錄最新的訪(fǎng)問(wèn)時(shí)間

1Cookie cookie=new Cookie("lastAccessTime",currentTime);2cookie.setMaxAge(60*10*500);//設(shè)置cookie存在時(shí)間3response.addConkie(cookie);//持久化cookie
  1. 從客戶(hù)端獲取cookie---lastAccessTime

 1String lastAccessTime=null; 2//從request中獲取cookie 3Cookie[] cookies=request.getCookies(); 4if(cookies!=null){ 5    for(Cookie coo:cookies){ 6        if("lastAccessTime".equals(coo.getName())){ 7            lastAccessTime=coo.getValue(); 8        } 9    }10}
  1. 判斷是否為第一次問(wèn)

1response.setContextType("text/html,charset=UTF-8");2if(lastAccessTime==null){3    response.getWriter().write("您是第一次訪(fǎng)問(wèn)");4}else{5    response.getWriter().write("您上次訪(fǎng)問(wèn)的時(shí)間是:"+lastAccessTime);6}

1.5. Session技術(shù)

1.5.1. session技術(shù)的實(shí)現(xiàn)原理
  1. session技術(shù)是將數(shù)據(jù)存儲(chǔ)到服務(wù)器上,面臨的問(wèn)題有如何知道存儲(chǔ)在服務(wù)器上的數(shù)據(jù)是你存儲(chǔ)的數(shù)據(jù)。

    怎么學(xué)習(xí)并掌握session和cookie

  1. 由此可見(jiàn)session技術(shù)是基于cookie技術(shù)存儲(chǔ)session編號(hào)----JSESSISION。

  2. 給服務(wù)器創(chuàng)建屬于一個(gè)客戶(hù)端的session區(qū)域,

  3. 向session區(qū)域中存取數(shù)據(jù)

1.5.2. 創(chuàng)建session會(huì)話(huà)
  1. session屬于客戶(hù)端私有的session區(qū)域,request.getSession()方法內(nèi)部會(huì)自動(dòng)判斷,該客戶(hù)端是否在服務(wù)器端已經(jīng)存在session,如果該客戶(hù)端在服務(wù)器上不存在session,那么就會(huì)創(chuàng)建一個(gè)新的session對(duì)象,如果該客戶(hù)端已經(jīng)存在session就會(huì)該session

1HttpSession session=request.getSession();2String id=session.getId();3response.getWriter().write("JESSIONID:"+id);//打印到瀏覽器上。
  1. 給session域中賦值

1session.setAttribute("name","jerry");
1.5.3. 關(guān)于session會(huì)話(huà)技術(shù)的面試題
  1. 重定向和轉(zhuǎn)發(fā)的區(qū)別:

  • 重定向請(qǐng)求兩次,轉(zhuǎn)發(fā)請(qǐng)求一次。

  1. session會(huì)話(huà)的聲明周期

創(chuàng)建: 第一次執(zhí)行request.getSession()時(shí)創(chuàng)建。(服務(wù)器端在執(zhí)行到request.getSession()時(shí)會(huì)查看cookie是否有sessionId,有就獲取,沒(méi)有就創(chuàng)建一個(gè)。)

銷(xiāo)毀: 1)服務(wù)器關(guān)閉時(shí)。2)session過(guò)期失效(默認(rèn)30分鐘)可以在web.xml配置。

手動(dòng)銷(xiāo)毀:session.invalidate();

作用范圍:默認(rèn)在一次會(huì)話(huà)中,也就是說(shuō)在一次會(huì)話(huà)中,任何資源公用一個(gè)session對(duì)象。

  1. 瀏覽器關(guān)閉,session就銷(xiāo)毀了?

    不對(duì),session域在服務(wù)器上,跟客戶(hù)端無(wú)關(guān),默認(rèn)30分鐘銷(xiāo)毀。

1.5.4. session的持久化技術(shù)
  1. session為什么要持久化?

    比如啟動(dòng)一個(gè)瀏覽器,設(shè)置好參數(shù)后,關(guān)閉瀏覽器,重啟,這些參數(shù)又丟失了。這不是很麻煩?就比如未登錄的百度一樣,設(shè)置了瀏覽記錄不可見(jiàn)的參數(shù),設(shè)置以后可以保證一段時(shí)間登陸百度看不到瀏覽記錄,但是一段時(shí)間過(guò)去后又出現(xiàn)了瀏覽記錄,我認(rèn)為這就用到了session持久化的技術(shù),除此之外驗(yàn)證碼的校驗(yàn)也需要用到session技術(shù),因?yàn)榇娣旁趓equest域中,一旦請(qǐng)求校驗(yàn),就會(huì)丟失,如果存儲(chǔ)在ServletContext()域中,就會(huì)成為全局的對(duì)象,整個(gè)登錄該網(wǎng)站的驗(yàn)證碼都會(huì)被加載進(jìn)去,這就不符合技術(shù)規(guī)范了,因此session域是適合的域。

  2. session如何實(shí)現(xiàn)持久化?

    session持久化的實(shí)現(xiàn)靠的是cookie實(shí)現(xiàn)的。首先需要讓cookie能夠長(zhǎng)期存儲(chǔ)session的id號(hào),那么就要設(shè)置cookie的存儲(chǔ)時(shí)間,因?yàn)閏ookie能存儲(chǔ)更長(zhǎng)時(shí)間,關(guān)閉瀏覽器也不會(huì)立即消失,就可以重新獲取cookie。

1String id=session.getId()//獲取session的id2Cookie cookie=new Cookie("JSESSIONID",id);//創(chuàng)建一個(gè)cookie,其中

感謝各位的閱讀,以上就是“怎么學(xué)習(xí)并掌握session和cookie”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么學(xué)習(xí)并掌握session和cookie這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI