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
- 創(chuàng)建一個cookie對象
Cookie cookie=new Cookie(String name,String Value);
- 為cookie設置持久化時間-----cookie信息在硬盤上保存的時間,時間到cookie會自動刪除柿扣。如果不設置這個cookie就會存儲在內存中肖方,關閉瀏覽器cookie信息被清空了。
cookie.setMaxAge(60*10);//10分鐘
- 設置cookie攜帶路徑未状,如果不設置俯画,每次訪問將攜帶所有網站的cookie會影響瀏覽器速度。
cookie.setPath(String path);
cookie.setPath("/WEB16/sendCookie");//訪問sendCookie資源時才攜帶這個cookie
cookie.setPath("/WEB16");//訪問WEB16下的所有資源都可以攜帶cookie司草。
如果不設置攜帶路徑活翩,那么該cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie信息。
- 向客戶端發(fā)送cookie
response.addCookie(Cookie cookie);
1.3.2. 從客戶端獲取cookie
- 獲得客戶端攜帶的cookie數據翻伺,通過getCookies()方法
Cookies[] cookies=request.getCookies();
- 遍歷數組材泄,用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中寫入最后一次瀏覽時間
- 獲取當前時間,并格式化時間
Date date =new Date();
SimpleDateFormat format=new SimpleDataFormat("yyyy-MM-dd hh:mm:ss");
String currentTime=format.format(date);//格式化當前的時間
- 創(chuàng)建cookie記錄最新的訪問時間
Cookie cookie=new Cookie("lastAccessTime",currentTime);
cookie.setMaxAge(60*10*500);//設置cookie存在時間
response.addConkie(cookie);//持久化cookie
- 從客戶端獲取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();
}
}
}
- 判斷是否為第一次問
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技術的實現原理
- session技術是將數據存儲到服務器上吨岭,面臨的問題有如何知道存儲在服務器上的數據是你存儲的數據拉宗。
- 由此可見session技術是基于cookie技術存儲session編號----JSESSISION。
- 給服務器創(chuàng)建屬于一個客戶端的session區(qū)域辣辫,
- 向session區(qū)域中存取數據
1.5.2. 創(chuàng)建session會話
- 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);//打印到瀏覽器上葬馋。
- 給session域中賦值
session.setAttribute("name","jerry");
1.5.3. 關于session會話技術的面試題
-
重定向和轉發(fā)的區(qū)別:
- 重定向請求兩次卖鲤,轉發(fā)請求一次肾扰。
-
session會話的聲明周期
創(chuàng)建: 第一次執(zhí)行request.getSession()時創(chuàng)建。(服務器端在執(zhí)行到request.getSession()時會查看cookie是否有sessionId,有就獲取蛋逾,沒有就創(chuàng)建一個集晚。)
銷毀: 1)服務器關閉時。2)session過期失效(默認30分鐘)可以在web.xml配置区匣。
手動銷毀:session.invalidate();
作用范圍:默認在一次會話中偷拔,也就是說在一次會話中,任何資源公用一個session對象亏钩。
-
瀏覽器關閉莲绰,session就銷毀了?
不對,session域在服務器上姑丑,跟客戶端無關蛤签,默認30分鐘銷毀。
1.5.4. session的持久化技術
-
session為什么要持久化彻坛?
比如啟動一個瀏覽器顷啼,設置好參數后,關閉瀏覽器昌屉,重啟钙蒙,這些參數又丟失了。這不是很麻煩间驮?就比如未登錄的百度一樣躬厌,設置了瀏覽記錄不可見的參數,設置以后可以保證一段時間登陸百度看不到瀏覽記錄竞帽,但是一段時間過去后又出現了瀏覽記錄扛施,我認為這就用到了session持久化的技術,除此之外驗證碼的校驗也需要用到session技術,因為存放在request域中屹篓,一旦請求校驗疙渣,就會丟失,如果存儲在ServletContext()域中堆巧,就會成為全局的對象妄荔,整個登錄該網站的驗證碼都會被加載進去,這就不符合技術規(guī)范了谍肤,因此session域是適合的域啦租。
-
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到客戶端