A. java Socket實現HTTP客戶端來理解Session和Cookie的區別和聯系
在面試中 經常碰到請闡述session與cookie的區別與聯系,以及如何修改兩者的有效時間。
大家都知道,session是存儲在伺服器端的,cookie是存儲在客戶端的,session依賴於cookie,但是讓你說詳細點,你會嗎?我是不太清楚的,特意在網上找了很多資料,發現一篇不錯的文章,特整理歸納在此,供有需要的朋友查看。
具體來說cookie機制採用的是在客戶端保持狀態的方案。它是在用戶端的會話狀態的存貯機制,他需要用戶打開客戶端的cookie支持。cookie的作用就是為了解決HTTP協議無狀態的缺陷所作的努力.
而session機制採用的是一種在客戶端與伺服器之間保持狀態的解決方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要藉助於cookie機制來達到保存標識的目的。而session提供了方便管理全局變數的方式
session是針對每一個用戶的,變數的值保存在伺服器上,用一個sessionID來區分是哪個用戶session變數,這個值是通過用戶的瀏覽器在訪問的時候返回給伺服器,當客戶禁用cookie時,這個值也可能設置為由get來返回給伺服器。
就安全性來說:當你訪問一個使用session 的站點,同時在自己機子上建立一個cookie,建議在伺服器端的SESSION機制更安全些.因為它不會任意讀取客戶存儲的信息。
正統的cookie分發是通過擴展HTTP協議來實現的,伺服器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie
從網路伺服器觀點看所有HTTP請求都獨立於先前請求。就是說每一個HTTP響應完全依賴於相應請求中包含的信息
狀態管理機制克服了HTTP的一些限制並允許網路客戶端及伺服器端維護請求間的關系。在這種關系維持的期間叫做會話(session)。
Cookies是伺服器在本地機器上存儲的小段文本並隨每一個請求發送至同一個伺服器。
session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。
當程序需要為某個客戶端的請求創建一個session的時候,伺服器首先檢查這個客戶端的請求里是否已包含了一個session標識 - 稱為 session id,如果已包含一個session id則說明以前已經為此客戶端創建過session,伺服器就按照session id把這個 session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字元串,這個 session id將被在本次響應中返回給客戶端保存。
在談論session機制的時候,常常聽到這樣一種誤解「只要關閉瀏覽器,session就消失了」。其實可以想像一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是一樣的,除非程序通知伺服器刪除一個session,否則伺服器會一直保留,程序一般都是在用戶做log off的時候發個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知伺服器它將要關閉,因此伺服器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器後這個 session id就消失了,再次連接伺服器時也就無法找到原來的session。如果伺服器設置的cookie被保存到硬碟上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的session id發送給伺服器,則再次打開瀏覽器仍然能夠找到原來的session。
恰恰是由於關閉瀏覽器不會導致session被刪除,迫使伺服器為seesion設置了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,伺服器就可以認為客戶端已經停止了活動,才會把session刪除以節省存儲空間。
大家都知道,http是無狀態的協議,客戶每次讀取web頁面時,伺服器都打開新的會話,而且伺服器也不會自動維護客戶的上下文信息,那麼要怎麼才能實現網上商店中的購物車呢,session就是一種保存上下文信息的機制,它是針對每一個用戶的,變數的值保存在伺服器端,通過SessionID來區分不同的客戶,session是以cookie或URL重寫為基礎的,默認使用cookie來實現,系統會創造一個名為JSESSIONID的輸出cookie,我們叫做session cookie,以區別persistent cookies,也就是我們通常所說的cookie,注意session cookie是存儲於瀏覽器內存中的,並不是寫到硬碟上的,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但是當我們把瀏覽器的cookie禁止後,web伺服器會採用URL重寫的方式傳遞Sessionid,我們就可以在地址欄看到sessionid=KWJHUG6JJM65HS2K6之類的字元串。
明白了原理,我們就可以很容易的分辨出persistent cookies和session cookie的區別了,網上那些關於兩者安全性的討論也就一目瞭然了,session cookie針對某一次會話而言,會話結束session cookie也就隨著消失了,而persistent cookie只是存在於客戶端硬碟上的一段文本(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊,自然不如session cookie安全了。
通常session cookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們信息共享的目的就達不到了,此時我們可以先把sessionid保存在persistent cookie中,然後在新窗口中讀出來,就可以得到上一個窗口SessionID了,這樣通過session cookie和persistent cookie的結合我們就實現了跨窗口的session tracking(會話跟蹤)。
在一些web開發的書中,往往只是簡單的把Session和cookie作為兩種並列的http傳送信息的方式,session cookies位於伺服器端,persistent cookie位於客戶端,可是session又是以cookie為基礎的,明白的兩者之間的聯系和區別,我們就不難選擇合適的技術來開發web service了。純屬復制
B. 關於Java里邊session和cookie的問題
伺服器壓力增大,有很多原因,不一定就是Session的事。
所有圖書列表信息,不知這個所有是指庫中存放的所有圖書,還是單指某一個人的所有圖書。如果是庫中的所有圖書,就應放入Application中或者一個靜態的全局變數中,而不是放在session中。
只考慮session的話,可以看看下面的建議:
session中,最佳處理是只放登錄後的人員基本信息,相關信息,再通過基本信息查詢,如果覺得從物理庫中查詢慢,可以採用內存資料庫,緩存不經常改變的信息。
C. java中的session和cookie問題,詳細講解下
您好,很高興為您解答,本人為在校學生,所以回答僅供參考,如有不足,請見諒:
對於 Java web 來說,session 和 cookie 都是數據存儲的「容器」,從位置來考慮,session 存儲於伺服器端的,在伺服器端進行存儲,可以存儲 POJO 等對象類型,常用來保存重要的標識信息,但在使用中要注意 session 的「瘦身」問題,如果程序稍微龐大的話,這點是不可置疑的,對於 session 中存儲的信息,客戶端的用戶是無法進行操作的,其原因究其在存儲於伺服器的特殊位置;
cookie 作為數據存儲的容器,其存儲的介質形式就不如 session 那樣」隨意「,其只能存儲 string 類型的數據變數,如果需要存儲復雜的對象類型,可以將對象信息轉換為 JSON 數據類型在進行操作,對於 cookie 來說,一般不見保存重要的用戶信息,因其保存在客戶端,所以安全性方面就會差一些,常見的 cookie 使用如「記住密碼」等操作,都是使用 cookie 來完成;
本人只是介紹了邏輯方面的些許知識,如果需要詢問其他方面的問題,可以跟帖回復;
D. java中session和cookie的區別
這些都是基礎知識,不過有必要做深入了解。先簡單介紹一下。
二者的定義:
當你在瀏覽網站的時候,WEB 伺服器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇,
都紀錄下來。當下次你再光臨同一個網站,WEB 伺服器會先看看有沒有它上次留下的 Cookie 資料,有的話,就會依據 Cookie
里的內容來判斷使用者,送出特定的網頁內容給你。 Cookie 的使用很普遍,許多有提供個人化服務的網站,都是利用 Cookie
來辨認使用者,以方便送出使用者量身定做的內容,像是 Web 介面的免費 email 網站,都要用到 Cookie。
具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。
同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要藉助於cookie機制
來達到保存標識的目的,但實際上它還有其他選擇。
cookie機制。正統的cookie分發是通過擴展HTTP協議來實現的,伺服器通過在HTTP的響應頭中加上一行特殊的指示以提示
瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie。而cookie的使用
是由瀏覽器按照一定的原則在後台自動發送給伺服器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用范圍
大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給伺服器。
cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用范圍。若不設置過期時間,則表示這
個cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。
會話cookie一般不存儲在硬碟上而是保存在內存里,當然這種行為並不是規范規定的。若設置了過期時間,瀏覽器就會把cookie
保存到硬碟上,關閉後再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬碟上的cookie可以在不同的瀏
覽器進程間共享,比如兩個IE窗口。而對於保存在內存里的cookie,不同的瀏覽器有不同的處理方式
session機制。session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。
當程序需要為某個客戶端的請求創建一個session時,伺服器首先檢查這個客戶端的請求里是否已包含了一個session標識
(稱為session id),如果已包含則說明以前已經為此客戶端創建過session,伺服器就按照session id把這個session檢索出來
使用(檢索不到,會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個與此session相
關聯的session id,session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字元串,這個session id將被在本次響應
中返回給客戶端保存。保存這個session id的方式可以採用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發送給
伺服器。一般這個cookie的名字都是類似於SEEESIONID。但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時
仍然能夠把session id傳遞回伺服器。
經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面。還有一種技術叫做表單隱藏欄位。就是伺服器
會自動修改表單,添加一個隱藏欄位,以便在表單提交時能夠把session id傳遞回伺服器。比如:
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="!-145788764">
<input type="text">
</form>
實際上這種技術可以簡單的用對action應用URL重寫來代替。
cookie 和session 的區別:
1、cookie數據存放在客戶的瀏覽器上,session數據放在伺服器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。
3、session會在一定時間內保存在伺服器上。當訪問增多,會比較佔用你伺服器的性能
考慮到減輕伺服器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
5、所以個人建議:
將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中
E. 能說下Java中session 和cookie的用法嗎 謝謝!
session是服務端的,cookie是客戶端的。
比如request.getsession.setattribute("a","b"); 取就用...getattribute("a");
cookie 先創建一個cookie對象然後設置保存時間和數據。這個網上找下很多。
F. JavaWeb之Cookie和Session的區別
區別是:
1、cookie數據存放在客戶的瀏覽器上,session數據放在伺服器上。
2、cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙
考慮到安全應當使用session。
3、session會在一定時間內保存在伺服器上。當訪問增多,會比較佔用你伺服器的性能
考慮到減輕伺服器性能方面,應當使用cookie。
4、單個cookie保存的數據不能超過4k,很多瀏覽器都限制一個站點最多保存20個cookie。
G. java session和cookie的區別
它們是完全不一樣的東西
session 是服務端用來記錄客戶端訪問會話的一類對象 主體是保存在服務端的
cookie 是瀏覽器提供的一種數據存儲方式 可以通過名值對來存取一些字元數據 不受頁面刷新限制 即便JS對象銷毀了也不會消失
他們之間的關聯是建立在sessionID上的
每個瀏覽器在訪問服務端的時候 服務端會創建一個session對象 這個對象在服務端有一個唯一的ID
這個ID會發給客戶端
客戶端只要根據這個ID就能訪問服務端對應session對象
這個ID肯定都是JS獲取到的 但是刷新頁面JS對象都銷毀了 ID也就沒了
所以會使用cookie這種機制來保存SessionID
這就是他們之間的關聯
H. java中session 最終在哪裡完成的是cookie么
沒有設定cookie存在時間,那麼cookie就等於session cookie存在於客戶端,session的作用是保證會話,畢竟http是無狀態協議嘛