cookie和session的區別(搜狐筆試考到的一個題目)

一、cookie機制和session機制的區別*************************************************************************************具體來說cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案。同時我們也看到,由于才服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助于cookie機制來達到保存標識的目的,但實際上還有其他選擇*************************************************************************************

二、會話cookie和持久cookie的區別*************************************************************************************如果不設置過期時間,則表示這個cookie生命周期為瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失了。這種生命期為瀏覽會話期的cookie被稱為會話cookie。會話cookie一般不保存在硬盤上而是保存在內存里。  如果設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie依然有效直到超過設定的過期時間。  存儲在硬盤上的cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對于保存在內存的cookie,不同的瀏覽器有不同的處理方式。*************************************************************************************

三、如何利用實現自動登錄*************************************************************************************  當用戶在某個網站注冊后,就會收到一個惟一用戶ID的cookie。客戶后來重新連接時,這個用戶ID會自動返回,服務器對它進行檢查,確定它是否為注冊用戶且選擇了自動登錄,從而使用戶務需給出明確的用戶名和密碼,就可以訪問服務器上的資源。*************************************************************************************

四、如何根據用戶的愛好定制站點*************************************************************************************  網站可以使用cookie記錄用戶的意愿。對于簡單的設置,網站可以直接將頁面的設置存儲在cookie中完成定制。然而對于更復雜的定制,網站只需僅將一個惟一的標識符發送給用戶,由服務器端的數據庫存儲每個標識符對應的頁面設置。*************************************************************************************

五、cookie的發送*************************************************************************************1.創建Cookie對象2.設置最大時效3.將Cookie放入到HTTP響應報頭如果你創建了一個cookie,并將他發送到瀏覽器,默認情況下它是一個會話級別的cookie:存儲在瀏覽器的內存中,用戶退出瀏覽器之后被刪除。如果你希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,并給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該cookie。發送cookie需要使用HttpServletResponse的addCookie方法,將cookie插入到一個Set-Cookie HTTP請求報頭中。由于這個方法并不修改任何之前指定的Set-Cookie報頭,而是創建新的報頭,因此我們將這個方法稱為是addCookie,而非setCookie。同樣要記住響應報頭必須在任何文檔內容發送到客戶端之前設置。

六、cookie的讀取*************************************************************************************1.調用request.getCookie要獲取有瀏覽器發送來的cookie,需要調用HttpServletRequest的getCookies方法,這個調用返回Cookie對象的數組,對應由HTTP請求中Cookie報頭輸入的值。2.對數組進行循環,調用每個cookie的getName方法,直到找到感興趣的cookie為止 cookie與你的主機(域)相關,而非你的servlet或JSP頁面。因而,盡管你的servlet可能只發送了單個cookie,你也可能會得到許多不相關的cookie。例如:  
String cookieName = “userID”;
Cookie cookies[] = request.getCookies();
if (cookies!=null){
for(int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
if (cookieName.equals(cookie.getName())) {
doSomethingWith(cookie.getValue());
}
}
}*************************************************************************************

七、如何使用cookie檢測初訪者*************************************************************************************A.調用HttpServletRequest.getCookies()獲取Cookie數組B.在循環中檢索指定名字的cookie是否存在以及對應的值是否正確C.如果是則退出循環并設置區別標識D.根據區別標識判斷用戶是否為初訪者從而進行不同的操作*************************************************************************************

八、使用cookie檢測初訪者的常見錯誤*************************************************************************************不能僅僅因為cookie數組中不存在在特定的數據項就認為用戶是個初訪者。如果cookie數組為null,客戶可能是一個初訪者,也可能是由于用戶將cookie刪除或禁用造成的結果。但是,如果數組非null,也不過是顯示客戶曾經到過你的網站或域,并不能說明他們曾經訪問過你的servlet。其它servlet、JSP頁面以及非Java Web應用都可以設置cookie,依據路徑的設置,其中的任何cookie都有可能返回給用戶的瀏覽器。正確的做法是判斷cookie數組是否為空且是否存在指定的Cookie對象且值正確。*************************************************************************************

九、使用cookie屬性的注意問題*************************************************************************************  屬性是從服務器發送到瀏覽器的報頭的一部分;但它們不屬于由瀏覽器返回給服務器的報頭。   因此除了名稱和值之外,cookie屬性只適用于從服務器輸出到客戶端的cookie;服務器端來自于瀏覽器的cookie并沒有設置這些屬性。   因而不要期望通過request.getCookies得到的cookie中可以使用這個屬性。這意味著,你不能僅僅通過設置cookie的最大時效,發出它,在隨后的輸入數組中查找適當的cookie,讀取它的值,修改它并將它存回Cookie,從而實現不斷改變的cookie值。*************************************************************************************

十、如何使用cookie記錄各個用戶的訪問計數*************************************************************************************1.獲取cookie數組中專門用于統計用戶訪問次數的cookie的值2.將值轉換成int型3.將值加1并用原來的名稱重新創建一個Cookie對象4.重新設置最大時效5.將新的cookie輸出*************************************************************************************

十一、session在不同環境下的不同含義*************************************************************************************session,中文經常翻譯為會話,其本來的含義是指有始有終的一系列動作/消息,比如打電話是從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之為一個session。然而當session一詞與網絡協議相關聯時,它又往往隱含了“面向連接”和/或“保持狀態”這樣兩個含義。  session在Web開發環境下的語義又有了新的擴展,它的含義是指一類用來在客戶端與服務器端之間保持狀態的解決方案。有時候Session也用來指這種解決方案的存儲結構。*************************************************************************************

十二、session的機制*************************************************************************************  session機制是一種服務器端的機制,服務器使用一種類似于散列表的結構(也可能就是使用散列表)來保存信息。但程序需要為某個客戶端的請求創建一個session的時候,服務器首先檢查這個客戶端的請求里是否包含了一個session標識-稱為session id,如果已經包含一個session id則說明以前已經為此客戶創建過session,服務器就按照session id把這個session檢索出來使用(如果檢索不到,可能會新建一個,這種情況可能出現在服務端已經刪除了該用戶對應的session對象,但用戶人為地在請求的URL后面附加上一個JSESSION的參數)。如果客戶請求不包含session id,則為此客戶創建一個session并且生成一個與此session相關聯的session id,這個session id將在本次響應中返回給客戶端保存。*************************************************************************************

十三、保存session id的幾種方式*************************************************************************************A.保存session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發送給服務器。B.由于cookie可以被人為的禁止,必須有其它的機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器,經常采用的一種技術叫做URL重寫,就是把session id附加在URL路徑的后面,附加的方式也有兩種,一種是作為URL路徑的附加信息,另一種是作為查詢字符串附加在URL后面。網絡在整個交互過程中始終保持狀態,就必須在每個客戶端可能請求的路徑后面都包含這個session id。C.另一種技術叫做表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務器。*************************************************************************************

十四、session什么時候被創建*************************************************************************************一個常見的錯誤是以為session在有客戶端訪問時就被創建,然而事實是直到某server端程序(如Servlet)調用HttpServletRequest.getSession(true)這樣的語句時才會被創建。*************************************************************************************

十五、session何時被刪除*************************************************************************************session在下列情況下被刪除:A.程序調用HttpSession.invalidate()B.距離上一次收到客戶端發送的session id時間間隔超過了session的最大有效時間C.服務器進程被停止

再次注意關閉瀏覽器只會使存儲在客戶端瀏覽器內存中的session cookie失效,不會使服務器端的session對象失效。*************************************************************************************

十六、URL重寫有什么缺點*************************************************************************************   對所有的URL使用URL重寫,包括超鏈接,form的action,和重定向的URL。每個引用你的站點的URL,以及那些返回給用戶的URL(即使通過間接手段,比如服務器重定向中的Location字段)都要添加額外的信息。   這意味著在你的站點上不能有任何靜態的HTML頁面(至少靜態頁面中不能有任何鏈接到站點動態頁面的鏈接)。因此,每個頁面都必須使用servlet或JSP動態生成。即使所有的頁面都動態生成,如果用戶離開了會話并通過書簽或鏈接再次回來,會話的信息都會丟失,因為存儲下來的鏈接含有錯誤的標識信息-該URL后面的SESSION ID已經過期了。  *************************************************************************************

十七、使用隱藏的表單域有什么缺點************************************************************************************* 僅當每個頁面都是有表單提交而動態生成時,才能使用這種方法。單擊常規的<A HREF..>超文本鏈接并不產生表單提交,因此隱藏的表單域不能支持通常的會話跟蹤,只能用于一系列特定的操作中,比如在線商店的結賬過程*************************************************************************************

十八、會話跟蹤的基本步驟*************************************************************************************1.訪問與當前請求相關的會話對象2.查找與會話相關的信息3.存儲會話信息4.廢棄會話數據*************************************************************************************

十九、getSession()/getSession(true)、getSession(false)的區別*************************************************************************************getSession()/getSession(true):當session存在時返回該session,否則新建一個session并返回該對象getSession(false):當session存在時返回該session,否則不會新建session,返回null*************************************************************************************

二十、如何將信息于會話關聯起來*************************************************************************************  setAttribute會替換任何之前設定的值;如果想要在不提供任何代替的情況下移除某個值,則應使用removeAttribute。這個方法會觸發所有實現了HttpSessionBindingListener接口的值的valueUnbound方法。*************************************************************************************

二十一、會話屬性的類型有什么限制嗎*************************************************************************************通常會話屬性的類型只要是Object就可以了。除了null或基本類型,如int,double,boolean。如果要使用基本類型的值作為屬性,必須將其轉換為相應的封裝類對象*************************************************************************************

二十二、如何廢棄會話數據*************************************************************************************A.只移除自己編寫的servlet創建的數據: 調用removeAttribute(“key”)將指定鍵關聯的值廢棄B.刪除整個會話(在當前Web應用中): 調用invalidate,將整個會話廢棄掉。這樣做會丟失該用戶的所有會話數據,而非僅僅由我們servlet或JSP頁面創建的會話數據C.將用戶從系統中注銷并刪除所有屬于他(或她)的會話 調用logOut,將客戶從Web服務器中注銷,同時廢棄所有與該用戶相關聯的會話(每個Web應用至多一個)。這個操作有可能影響到服務器上多個不同的Web應用*************************************************************************************

二十三、使用isNew來判斷用戶是否為新舊用戶的錯誤做法*************************************************************************************public boolean isNew()方法如果會話尚未和客戶程序(瀏覽器)發生任何聯系,則這個方法返回true,這一般是因為會話是新建的,不是由輸入的客戶請求所引起的。但如果isNew返回false,只不過是說明他之前曾經訪問該Web應用,并不代表他們曾訪問過我們的servlet或JSP頁面。因為session是與用戶相關的,在用戶之前訪問的每一個頁面都有可能創建了會話。因此isNew為false只能說用戶之前訪問過該Web應用,session可以是當前頁面創建,也可能是由用戶之前訪問過的頁面創建的。正確的做法是判斷某個session中是否存在某個特定的key且其value是否正確*************************************************************************************

二十四、Cookie的過期和Session的超時有什么區別*************************************************************************************會話的超時由服務器來維護,它不同于Cookie的失效日期。首先,會話一般基于駐留內存的cookie不是持續性的cookie,因而也就沒有截至日期。即使截取到JSESSIONID cookie,并為它設定一個失效日期發送出去。瀏覽器會話和服務器會話也會截然不同。*************************************************************************************

二十五、session cookie和session對象的生命周期是一樣的嗎*************************************************************************************當用戶關閉了瀏覽器雖然session cookie已經消失,但session對象仍然保存在服務器端*************************************************************************************

二十六、是否只要關閉瀏覽器,session就消失了*************************************************************************************程序一般都是在用戶做log off的時候發個指令去刪除session,然而瀏覽器從來不會主動在關閉之前通知服務器它將要被關閉,因此服務器根本不會有機會知道瀏覽器已經關閉。服務器會一直保留這個會話對象直到它處于非活動狀態超過設定的間隔為止。之所以會有這種錯誤的認識,是因為大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器后這個session id就消失了,再次連接到服務器時也就無法找到原來的session。如果服務器設置的cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發出的HTTP請求報頭,把原來的session id發送到服務器,則再次打開瀏覽器仍然能夠找到原來的session。恰恰是由于關閉瀏覽器不會導致session被刪除,迫使服務器為session設置了一個失效時間,當距離客戶上一次使用session的時間超過了這個失效時間時,服務器就可以認為客戶端已經停止了活動,才會把session刪除以節省存儲空間。  由此我們可以得出如下結論:  關閉瀏覽器,只會是瀏覽器端內存里的session cookie消失,但不會使保存在服務器端的session對象消失,同樣也不會使已經保存到硬盤上的持久化cookie消失。*************************************************************************************

二十七、打開兩個瀏覽器窗口訪問應用程序會使用同一個session還是不同的session*************************************************************************************通常session cookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你一個新的session id,這樣我們信息共享的目的就達不到了。此時我們可以先把session id保存在persistent cookie中(通過設置session的最大有效時間),然后在新窗口中讀出來,就可以得到上一個窗口的session id了,這樣通過session cookie和persistent cookie的結合我們就可以實現了跨窗口的會話跟蹤。*************************************************************************************

二十八、如何使用會話顯示每個客戶的訪問次數*************************************************************************************由于客戶的訪問次數是一個整型的變量,但session的屬性類型中不能使用int,double,boolean等基本類型的變量,所以我們要用到這些基本類型的封裝類型對象作為session對象中屬性的值  但像Integer是一種不可修改(Immutable)的數據結構:構建后就不能更改。這意味著每個請求都必須創建新的Integer對象,之后使用setAttribute來代替之前存在的老的屬性的值。例如:HttpSession session = request.getSession();SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);if (value= =null){ value = new SomeImmutableClass(…); // 新創建一個不可更改對象}else{ value = new SomeImmutableClass(calculatedFrom(value)); // 對value重新計算后創建新的對象}session.setAttribute(“someIdentifier”,value); // 使用新創建的對象覆蓋原來的老的對象*************************************************************************************

二十九、如何使用會話累計用戶的數據*************************************************************************************使用可變的數據結構,比如數組、List、Map或含有可寫字段的應用程序專有的數據結構。通過這種方式,除非首次分配對象,否則不需要調用setAttribute。例如

HttpSession session = request.getSession();SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);if(value = = null){ value = new SomeMutableClass(…); session.setAttribute(“someIdentifier”,value);}else{ value.updateInternalAttribute(…); // 如果已經存在該對象則更新其屬性而不需重新設置屬性}*************************************************************************************

三十、不可更改對象和可更改對象在會話數據更新時的不同處理*************************************************************************************不可更改對象因為一旦創建之后就不能更改,所以每次要修改會話中屬性的值的時候,都需要調用setAttribute(“someIdentifier”,newValue)來代替原有的屬性的值,否則屬性的值不會被更新可更改對象因為其自身一般提供了修改自身屬性的方法,所以每次要修改會話中屬性的值的時候,只要調用該可更改對象的相關修改自身屬性的方法就可以了。這意味著我們就不需要調用setAttribute方法了*************************************************************************************

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容

  • 寫在前面 cookie和session的區別: 1、cookie數據存放在客戶的瀏覽器上,session數據放在服...
    Pitfalls閱讀 1,533評論 0 17
  • 背景在HTTP協議的定義中,采用了一種機制來記錄客戶端和服務器端交互的信息,這種機制被稱為cookie,cooki...
    時芥藍閱讀 2,379評論 1 17
  • 一、cookie機制和session機制的區別 具體來說cookie機制采用的是在客戶端保持狀態的方案,而sess...
    Rella7閱讀 4,728評論 0 7
  • 效果圖 原理 主要應用到了SVG的兩個屬性分別為: stroke-dasharray和stroke-dashoff...
    劉翾閱讀 787評論 0 0
  • 第六章朱雀城 大夏帝國 朱雀城城門口 “大哥,科舉要開始了,這些讀書人都趕著考試來了,你看剛才進去的那個,一看...
    逸楓軒閱讀 126評論 0 2