cookie和session常见问题
生活随笔
收集整理的這篇文章主要介紹了
cookie和session常见问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、cookie和session原理及區別 cookie采用的是客戶端的會話狀態的一種儲存機制。session是一種服務器端的信息管理機制,它把這些文件信息以文件的形式存放在服務器的硬盤空間上
(這是默認情況,可以用memcache把這種數據放到內存里面)區別:Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。2、 session產生的session_id放在cookie里面,如果用戶把cookie禁止掉,是不是session也不能用了呢?
禁止掉cookie后,session當然可以用,不過通過其他的方式來獲得這個sessionid,比如,可以跟在url的
后面,或者以表單的形勢提交到服務器端。從而使服務器端了解客戶端的狀態。3、 為什么說session 比cookie更安全?
1.sessionID是加密的,第二次session_start的時候,前一次的sessionID就沒有用了,session過期
時sessionid也會失效,
2.想在短時間內功破加了密的 sessionID很難。session是針對某一次通信而言,會話結束session也就隨著
消失了。使session失效的方法:
1.關閉tomcat 2.重啟web應用 3.session時間到 4.無效的sessioncookie和session的區別:①存在的位置:
cookie 存在于客戶端,臨時文件夾中; session存在于服務器的內存中,一個session域對象為一個用戶
瀏覽器服務②安全性
cookie是以明文的方式存放在客戶端的,安全性低,可以通過一個加密算法進行加密后存放; session存放于
服務器的內存中,所以安全性好③網絡傳輸量
cookie會傳遞消息給服務器; session本身存放于服務器,不會有傳送流量④生命周期(以20分鐘為例)
cookie的生命周期是累計的,從創建時,就開始計時,20分鐘后,cookie生命周期結束;session的生命
周期是間隔的,從創建時,開始計時如在20分鐘,沒有訪問session,那么session生命周期被銷毀。但是,
如果在20分鐘內(如在第19分鐘時)訪問過session,那么,將重新計算session的生命周期。關機會造成
session生命周期的結束,但是對cookie沒有影響⑤訪問范圍
cookie為多個用戶瀏覽器共享; session為一個用戶瀏覽器獨享
session和cookie的區別
Cookie用來存儲用戶緩存數據,存儲在瀏覽器中,關閉瀏覽器還會保存在瀏覽器.一般Cookie失效是因為,開發者設置的 時間期限已到.而且他可以由用戶任意修改,不安全.且Cookie存儲的數據為簡單類型數據.Session跟Cookie一樣也是用來存儲用戶數據,區別在于Session存儲的緩存數據在服務器中,保存在瀏覽器的只是 用戶訪問服務器緩存的鑰匙(session_id).而且Session可以存儲復雜數據類型.Session會在用戶關閉瀏覽器的時候清除失效,總而言之Session相對 于Cookie來說較安全.但沒有絕對的安全1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。2、cookie不是很安全,別人可以分析存放在本地的cookie并進行cookie欺騙,考慮到安全應當使用session。3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能,考慮到減輕服務器 性能方面,應當使用cookie。4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。5、可以考慮將登陸信息等重要信息存放為session,其他信息如果需要保留,可以放在cookie中。一、cookie機制和session機制的區別 1.cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案。 2.服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助于cookie機制來達到 保存標識的目的,但實際上還有其他選擇二、會話cookie和持久cookie的區別 1.如果不設置過期時間,則表示這個cookie生命周期為瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就 消失了。這種生命期為瀏覽會話期的cookie被稱為會話cookie。會話cookie一般不保存在硬盤上而是保存 在內存里。 2.如果設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie依然有效 直到超過設定的過期時間。 3.存儲在硬盤上的cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對于保存在內存的cookie, 不同的瀏覽器有不同的處理方式。三、如何利用實現自動登錄 當用戶在某個網站注冊后,就會收到一個惟一用戶ID的cookie。客戶后來重新連接時,這個用戶ID會自動 返回,服務器對它進行檢查,確定它是否為注冊用戶且選擇了自動登錄,從而使用戶務需給出明確的用戶名 和密碼,就可以訪問服務器上的資源。四、cookie的發送 1.創建Cookie對象 2.設置最大時效 3.將Cookie放入到HTTP響應報頭 4.如果你創建了一個cookie,并將他發送到瀏覽器,默認情況下它是一個會話級別的cookie,存儲在瀏覽器 的內存中,用戶退出瀏覽器之后被刪除。 5.如果你希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,并給出一個以秒為單位的時間。將最大 時效設為0則是命令瀏覽器刪除該cookie。五、cookie的讀取 1.要獲取有瀏覽器發送來的cookie,需要調用HttpServletRequest的getCookies方法,這個調用 返回Cookie對象的數組,對應由HTTP請求中Cookie報頭輸入的值。 2.對數組進行循環,調用每個cookie的getName方法,直到找到感興趣的cookie為止 3.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());}}}六、保存session id的幾種方式 A.保存session id的方式可以采用cookie B.由于cookie可以被人為的禁止,必須有其它的機制以便在cookie被禁止時仍然能夠把session id傳遞 回服務器,經常采用的一種技術叫做URL重寫,就是把session id附加在URL路徑的后面八、session什么時候被創建 一個常見的錯誤是以為session在有客戶端訪問時就被創建,然而事實是直到某server端程序(如Servlet) 調用HttpServletRequest.getSession(true)這樣的語句時才會被創建。session在下列情況下被刪除: A.程序調用HttpSession.invalidate() B.距離上一次收到客戶端發送的session id時間間隔超過了session的最大有效時間 C.服務器進程被停止 再次注意關閉瀏覽器只會使存儲在客戶端瀏覽器內存中的session cookie失效,不會使服務器端的session 對象失效。九、getSession()/getSession(true)、getSession(false)的區別 1.getSession()/getSession(true):當session存在時返回該session,否則新建一個session并返回 該對象 2.getSession(false):當session存在時返回該session,否則不會新建session,返回null十、會話屬性的類型有什么限制嗎 1.通常會話屬性的類型只要是Object就可以了。除了null或基本類型,如int,double,boolean。 2.如果要使用基本類型的值作為屬性,必須將其轉換為相應的封裝類對象十一、如何廢棄會話數據 A.只移除自己編寫的servlet創建的數據:調用removeAttribute(“key”)將指定鍵關聯的值廢棄 B.刪除整個會話(在當前Web應用中):調用invalidate,將整個會話廢棄掉。這樣做會丟失該用戶的所有 會話數據,而非僅僅由我們servlet或JSP頁面創建的會話數據十二、session cookie和session對象的生命周期是一樣的嗎 當用戶關閉了瀏覽器雖然session cookie已經消失,但session對象仍然保存在服務器端十四、是否只要關閉瀏覽器,session就消失了1.瀏覽器從來不會主動在關閉之前通知服務器它將要被關閉,因此服務器根本不會有機會知道瀏覽器已經 關閉。是因為大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器后這個session id 就消失了,再次連接到服務器時也就無法找到原來的session。2.恰恰是由于關閉瀏覽器不會導致session被刪除,迫使服務器為session設置了一個失效時間,當距離客戶 上一次使用session的時間超過了這個失效時間時,服務器就可以認為客戶端已經停止了活動,才會把 session刪除以節省存儲空間。3.關閉瀏覽器,只會是瀏覽器端內存里的session cookie消失,但不會使保存在服務器端的session對象 消失,同樣也不會使已經保存到硬盤上的持久化cookie消失。十四、打開兩個瀏覽器窗口訪問應用程序會使用同一個session還是不同的session1.通常session cookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你 一個新的session id,這樣我們信息共享的目的就達不到了。2.我們可以先把session id保存在persistent cookie中(通過設置session的最大有效時間),然后在 新窗口中讀出來,就可以得到上一個窗口的session id了,這樣通過session cookie和persistent cookie的結合我們就可以實現了跨窗口的會話跟蹤。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或含有可寫字段的應用程序專有的數據結構。HttpSession session = request.getSession();SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);if(value = = null){value = new SomeMutableClass(…);session.setAttribute(“someIdentifier”,value);}else{value.updateInternalAttribute(…); // 如果已經存在該對象則更新其屬性而不需重新設置 屬性}Cookie與session的區別及其常見問題
1.服務器端向客戶端發送一個Cookie1)創建Cookie: Cookie cookie = new Cookie(String cookieName,String cookieValue); Cookie cookie = new Cookie("username","zhangsan");那么該cookie會以響應頭的形式發送給客戶端:注意:Cookie中不能存儲中文2)設置Cookie在客戶端的持久化時間: cookie.setMaxAge(int seconds); ---時間秒注意:如果不設置持久化時間,cookie會存儲在瀏覽器的內存中,瀏覽器關閉cookie信息銷毀(會話級別 的cookie),如果設置持久化時間,cookie信息會被持久化到瀏覽器的磁盤文件里cookie.setMaxAge(10*60); 設置cookie信息在瀏覽器的磁盤文件中存儲的時間是10分鐘,過期瀏覽器 自動刪除該cookie信息3)設置Cookie的攜帶路徑: 注意:如果不設置攜帶路徑,那么該cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie 信息cookie.setPath("/WEB16");代表訪問WEB16應用中的任何資源都攜帶cookie cookie.setPath("/WEB16/cookieServlet");4)向客戶端發送cookie:response.addCookie(Cookie cookie);5)刪除客戶端的cookie:如果想刪除客戶端的已經存儲的cookie信息,那么就使用同名同路徑的持久化時間為0的cookie進行覆蓋即可2.服務器端怎么接受客戶端攜帶的Cookiecookie信息是以請求頭的方式發送到服務器端的:1)通過request獲得所有的Cookie: Cookie[] cookies = request.getCookies();2)遍歷Cookie數組,通過Cookie的名稱獲得我們想要的Cookiefor(Cookie cookie : cookies){if(cookie.getName().equal(cookieName)){String cookieValue = cookie.getValue();}}二、Session技術Session技術是將數據存儲在服務器端的技術,會為每個客戶端都創建一塊內存空間存儲客戶的數據,但 客戶端需要每次都攜帶一個標識ID去服務器中尋找屬于自己的內存空間。Session的實現是基于Cookie,Session需要借助于Cookie存儲客 戶的唯一性標識JSESSIONID1.獲得Session對象 HttpSession session = request.getSession();此方法會獲得專屬于當前會話的Session對象,如果服務器端沒有該會話的Session對象會創建一個新 的Session返回,如果已經有了屬于該會話的Session直接將已有的Session返回(實質就是 根據JSESSIONID判斷該客戶端是否在服務器上已經存在session了)2.怎樣向session中存取數據(session也是一個域對象) Session也是存儲數據的區域對象,所以session對象也具有如下三個方法: session.setAttribute(String name,Object obj); session.getAttribute(String name); session.removeAttribute(String name);3.Session對象的生命周期創建:第一次執行request.getSession()時創建銷毀:1)服務器(非正常)關閉時2)session過期/失效(默認30分鐘)問題:時間的起算點 從何時開始計算30分鐘? 從不操作服務器端的資源開始計時(例如:當你訪問淘寶頁面時,點開頁面不動,第29分鐘再動一下頁面, 就得重新計時30分鐘;當過了30分鐘,就失效了。)可以在工程的web.xml中進行配置 <session-config><session-timeout>30</session-timeout> </session-config>3)手動銷毀session session.invalidate(); 作用范圍: 默認在一次會話中,也就是說在,一次會話中任何資源共用一個session對象瀏覽器關閉,session就銷毀了? 不對,瀏覽器關閉和服務器session銷毀沒有任何關系!會話技術:Cookie技術:存到客戶端發送cookie Cookie cookie = new Cookie(name,value) cookie.setMaxAge(秒) cookie.setPath() response.addCookie(cookie)獲得cookie Cookie[] cookies = request.getCookies(); cookie.getName(); cookie.getValue();Session技術:存到服務器端 借助cookie存儲JSESSIONID HttpSession session = request.getSession(); setAttribute(name,value); getAttribute(name);session生命周期 創建:第一次指定request.getSession(); 銷毀:服務器關閉、session失效/過期、手動session.invalidate();session作用范圍:默認一會話中?
總結
以上是生活随笔為你收集整理的cookie和session常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery问题
- 下一篇: 对原生ajax的理解