web筆記七:cookie和session

在瞭解cookie和session之前,我們需要知道http請求是無狀態的,那什麼叫無狀態呢?簡單來說,無論是誰發起的請求,對於服務器來說,都一視同仁,服務器不會知道哪個請求是誰發送的,哪幾個請求是有關聯的。

那麼,如果我想針對每客戶端發起的請求各自保留一些數據,這時候該怎麼辦呢?這時候就需要用到cookie和session。

Cookie的特性:
Cookie具有不可跨域性,瀏覽器訪問百度只會攜帶百度的cookie,訪問谷歌只會攜帶谷歌的cookie,www.baidu.com無法訪問谷歌的cookie。而且,images.google.comwww.google.com雖然同屬於google,但是由於域名不一樣,也無法訪問各自的cookie,如果希望實現兩個網站的cookie共享,可以通過cookie.setDomain(".google.com")進行設置(必須以點(.)開頭),但是這種設置還是無法在a.b.google.com中共享cookie。
在代碼中,cookie也不提供修改和刪除功能,只能是將cookie覆蓋,假如我們想刪除一個cookie,只要設置一個key同名的cookie,將maxAge設置爲0,並將其添加到response中即可。值得注意的是:新建的Cookie除value、maxAge之外的所有屬性,例如name、path、domain等,都要與原Cookie完全一樣,否則瀏覽器會認爲這是兩個不同的cookie。

Cookie cookie=new Cookie("key","value");
cookie.setMaxAge(0);
response.addCookie(cookie);

同一個域名下默認會共享所有的cookie,那假如我們的域名www.foo.com下有兩個應用www.foo.com/webwww.foo.com/app,我們不希望app應用的cookie傳輸到web應用上,那麼可以在app應用中設置通過cookie.setPath("/app")進行設置(注意必須以斜槓(/)開頭),這樣的話該cookie只會在contextPath爲/app的應用下傳輸。

關於保存中文,Cookie中保存中文只能編碼。一般使用UTF-8編碼即可!

Cookie部分屬性說明

屬性 說明
int maxAge Cookie失效的時間,單位秒。如果爲正數,則該Cookie在maxAge秒之後失效。如果爲負數,該Cookie爲臨時Cookie,關閉瀏覽器即失效。如果爲0,表示刪除該Cookie。默認爲–1
boolean secure 表明該cookie是否使用安全協議傳輸,如HTTPS,SSL等,默認爲false
String path 設置cookie只在指定的目錄下及其子目錄下生效,類似於設置contextPath
String domain 設置指定域名的下級域名都能訪問該cookie,必須以點(.)開始
String comment 瀏覽器顯示Cookie信息的時候顯示該說明

session的特性:
session是保存在服務器內存中的,每個客戶端都會擁有獨自的session,當請求過多時,可能會導致內存溢出,所以session保存的信息儘量精簡,一般用於保存用戶的登錄信息。
session需要根據名爲jsessionid的cookie來判別請求是否來自同一個客戶端:當一個客戶端A的請求在服務器生成session時(例如通過request.getSession()),服務器會生成一個唯一的id,這個id會封裝成一個cookie對象(key爲jsessionid,value爲id),並由response.setCookie()保存到客戶端A中,客戶端A下次請求服務器的時候,會將該cookie一併發送到服務器中,服務器就可以通過jsesssionid得到對應的session,由此來鑑定該請求是來自A客戶端的而不是其他的客戶端。
假如瀏覽器/客戶端禁用cookie,那麼一般情況下將拿不到jsessionid,服務器也就認爲是一個新的連接,這時候session機制將會失效,如果希望在禁用cookie的情況下使用session,可以使用URL重寫的方式去實現

String encodeURL=response.encodeURL(url);
String encodeRedirectURL=response.encodeRedirectURL(url);

假如你請求的url是/foo,那麼重寫後的URL類似/foo;jsessionid=0F8D97B0BE608AFDC3E.....服務器就會根據jsessionid找到對應的session信息。


問題一:怎麼獲取cookie和session

//獲取cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
    System.out.println(cookie.getName() + ":" + cookie.getValue());
}
//獲取session,兩種方式
HttpSession session = request.getSession();//相當於request.getSession(true)
HttpSession session2 = request.getSession(true);

getSession方法中參數爲true,無論如何都能獲取到HttpSession對象,但是如果爲false,只能獲取到原有的HttpSession對象,如果沒有則返回null。

問題二:cookie和session的區別都有哪些

a. 存儲位置:
cookie存儲在瀏覽器,session是存儲在服務器

b. 存儲能力
單個cookie只能保存4KB的信息(這個我沒有去考究),而session的保存能力跟服務器有關,能存儲較大的數據量,存儲的量越大對服務器越有壓力。

c.失效時間
cookie默認在瀏覽器關閉的時候失效,可以通過setMaxAge設置生命週期時長(單位:秒),超時後cookie會自動失效。
session失效的方式有三種:
1.超時。和cookie不同的是,每次使用session的時候會重新計算超時時間。
2.調用session.invalidate();
3.服務器崩潰或者停止

問題三、如何設置超時時間
1、session:

<!--在web.xml設置,這裏設置的單位是分鐘-->
<session-config>
    <session-timeout>15</session-timeout>
</session-config>

//在代碼中設置,這裏的單位是秒
session.setMaxInactiveInterval(15*60);

2、cookie

cookie.setMaxAge(10);//單位爲秒,默認是-1(關閉瀏覽器則清除該cookie)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章