session机制和cookie机制
一、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 cookie if dosomethingwith a b c d web session id 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方法了
轉載于:https://blog.51cto.com/lya041/660487
總結
以上是生活随笔為你收集整理的session机制和cookie机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 依据地图上的经纬度坐标计算某个点到多边形
- 下一篇: <2021SC@SDUSC> 开源游戏引