web開發:cookie是什麼?原理是什麼?怎麼使用?用在什麼地方?

存儲客戶端的狀態

京東商城在沒有登陸的情況下依然可以將商品加入購物車,那麼這個購物車的數據存儲到哪裡呢?肯定不是request,因為如果是它的話,每加入一件,再去訪問其它商品,在加入一件,上一次商品就沒有了,因為Http協議是無狀態的,也就是說每個客戶訪問服務器端資源時,在未登錄的情況下,服務器並不知道該客戶端是誰,所以需要會話技術識別客戶端的狀態。會話技術是幫助服務器記住客戶端狀態

會話技術Cookie和Session

從打開一個瀏覽器訪問某個站點,到關閉這個瀏覽器的整個過程,成為一次會話。會話技術就是記錄這次會話中客戶端的狀態與數據的。

Cookie:數據存儲在客戶端本地,減少服務器端的存儲的壓力,安全性不好,客戶端可以清除cookieSession:將數據存儲到服務器端,安全性相對好,增加服務器的壓力

Cookie技術詳解

web開發:cookie是什麼?原理是什麼?怎麼使用?用在什麼地方?

創建Cookie

Cookie cookie = new Cookie(String cookieName,String cookieValue);

參數為cookie的名稱和cookie的值,舉例:Cookie cookie = new Cookie("username","zhangsan");

那麼創建了一個cookie,並且向cookie中寫入了數據username=zhangsan,注意cookie中不能寫入中文,也就是說後面的驗證碼效驗,如果是中文驗證碼,則不能用cookie

如果我們將這個cookie向客戶端發送,那麼相應頭的形式是這樣的

web開發:cookie是什麼?原理是什麼?怎麼使用?用在什麼地方?

設置Cookie在客戶端的持久化時間

cookie.setMaxAge(int seconds);seconds為秒

cookie默認的生命週期是一個會話,就是說只要瀏覽器關係,他就沒有了,如果不設置持久化時間,cookie會存儲在瀏覽器的內存中,瀏覽器關閉cookie信息銷燬(會話級別的cookie),如果設置持久化時間,cookie信息會被持久化到瀏覽器的磁盤文件裡,設置多久時間,他就會存在多長時間

舉例:

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

設置Cookie的攜帶路徑

如果不設置攜帶路徑,那麼該cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie信息,比如/aa/servlet的這個路徑的servlet產生了cookie,那麼只有在訪問WWW/aa下的資源的時候才會帶cookie,如果訪問WWW/a.jsp則不會帶cookie,因為他不是aa目錄下的

示例:

cookie.setPath("/WEB16");代表訪問WEB16應用中的任何資源都攜帶cookiecookie.setPath("/WEB16/cookieServlet");代表訪問WEB16中的cookieServlet時才攜帶cookie信息cookie.setPath("/");訪問服務器下的所有應用都攜帶這個cookie

向客戶端發送cookie:

response.addCookie(Cookie cookie);創建完成之後,只有發送才能到答響應體

刪除客戶端的cookie:

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

new相同name值的cookie,值無所謂(new相同的name的cookie會把前面相同name的覆蓋)設置相同的setpath,最好設置最大Age為0,才刪除,必須全部一樣然後response.Add(這個cookie)向響應頭增加一個set-cookie字段

第一次瀏覽器訪問網站因為沒有cookie,所以請求行沒有cookie,假如他訪問的servlet,new了一個cookie,並且response。add這個cookie,那麼下次瀏覽器在訪問這個網站資源(如果setpath合適的話),他會在請求頭中帶上這個cookie

web開發:cookie是什麼?原理是什麼?怎麼使用?用在什麼地方?

那麼我們此時可以通過request獲取這個cookie,並且解析裡面的值

1)通過request獲得所有的Cookie:(只能獲取所有)Cookie[] cookies = request.getCookies();2)遍歷Cookie數組,通過Cookie的名稱獲得我們想要的Cookiefor(Cookie cookie : cookies){if(cookie.getName().equal(cookieName)){String cookieValue = cookie.getValue();}}

一個cookie創建的時候只能添加一個鍵值對,一個web站點可以給web瀏覽器發送多個cookie,一個瀏覽器也可以存儲多個cookie,一般允許存放300個cookie,每個網站允許存放20個

Session技術

web開發:cookie是什麼?原理是什麼?怎麼使用?用在什麼地方?

Session技術是將數據存儲在服務器端的技術,會為每個客戶端都創建一塊內存空間存儲客戶的數據,但客戶端需要每次都攜帶一個標識ID去服務器中尋找屬於自己的內存空間(session)這個它自動操作,不用我們關心。這個JSESSIONID是在cookie中存儲,所以說Session的實現是基於Cookie,Session需要藉助於Cookie存儲客戶的唯一性標識JSESSIONID,JSESSIONID被清了之後(cookie被刪),即使session還存在,但是因為cookie存儲的JSESSIONID不在了,也找不到這個Session了

cookie創建,之後,需要手動的response.addCookie,而session不用,只要創建之後,服務器會自動的將其放到了服務器端了。

1.獲得Session對象

HttpSession session = request.getSession();

此方法會獲得專屬於當前會話的Session對象,如果服務器端沒有該會話的Session對象會創建一個新的Session返回,如果已經有了屬於該會話的Session直接將已有的Session返回,這個方法實質就是它會先獲取cookie中的JSESSIONID,如果沒有獲取到則直接創建session,如果獲取到JSESSIONID,則去找對應的session,如果有則獲取session對象,如果沒有則創建。

HttpSession session = request.getSession(false);//有就獲取,沒有不創建

如果cookie被清的話,雖然session還存在,但是當我們request.getSession();的時候因為JSESSIONID沒有了,所以還是會創建一個新的session,併產生一個新的JSESSIONID

當我們有session對象的時候可以通過session.Getid()的方式來獲取JSESSIONID

向session中存取數據(session也是一個域對象)

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

Session對象的生命週期

創建:第一次執行request.getSession()時創建

銷燬:服務器(非正常)關閉時或session過期/失效(默認30分鐘)

30分鐘是從什麼時候開始算呢?從不操作服務器端的資源開始計時,訪問一個網頁,然後就不點擊了,就開始計時,如果29分鐘不動,之後再訪問網站的其它資源,又開始重新計時,從0開始

默認30分鐘可以在工程的web.xml中進行配置
30

注意瀏覽器關閉是cookie默認銷燬,但是session還會存在,但是cookie銷燬session就沒有什麼意義了,因為找session要靠cookie

3)手動銷燬session

session.invalidate();

我們要樹立一個觀念cookie和session都是和瀏覽器相關的,和用戶是否登陸無關

session對象由服務器創建,開發人員可以調用request對象的getsession方法獲取session對象,因為session默認有效期為一個會話(雖然它30分鐘消亡,但是它的有效期還是一個會話,原因是cookie默認有效期一個會話,cookie死亡,session也沒意義了)

那麼如何才能讓session所對應的那個cookie存活時間長點呢?不至於關掉瀏覽器就滅亡,它存活時間長,session才能更有意義。

首先我們要獲取或創建session,然後獲取這個session的JSESSIONID,然後創建cookie(要完全按照session所對應的cookie的鍵,這樣才會覆蓋),還要設置相同路徑,session的cookie的默認路徑為/應用名稱,之後設置好時間,這樣就ok了

web開發:cookie是什麼?原理是什麼?怎麼使用?用在什麼地方?

session是為會話服務,也就是說所有瀏覽器訪問的web應用都有機會可以獲取到session,但是因為想要獲取session前提是cookie,而cookie默認在哪個應用創建cookie,訪問這個網站時瀏覽器才會帶上這些cookie,所以自己的應用只能得到自己的cookie,訪問自己的session。

如果瀏覽器把cookie給禁止了怎麼辦?

使用cookie的目的時讓其帶著sessionid去訪問服務器資源,來確定是否有session可以用,若cookie被禁止的話,就只能在超鏈接後面加上session號了,這樣訪問超鏈接時,也相當於帶著session號去訪問資源,一次來確定是否有session可以用

web開發:cookie是什麼?原理是什麼?怎麼使用?用在什麼地方?

這樣購買鏈接後面帶有session號,點擊鏈接訪問servlet1,它內部獲取session的話,它自動會按照session號來找,和cookie一樣,只不過以前cookie的是自動,而這個是手動設置,當兩種方式都存在時,以cookie為主

web開發:cookie是什麼?原理是什麼?怎麼使用?用在什麼地方?

同時打開多個瀏覽器在,只得是一個瀏覽器打開多個頁面,比如新加選項卡,這些都是屬於一個會話的


分享到:


相關文章: