httpsession 詳細內容整理

2021-08-31 06:40:57 字數 2326 閱讀 6841

最近在做登入和許可權控制模組,用到了session,發現session的好多方法都不熟悉,而且以前也聽說過jsessionid 之類session竊取的事,對這些一直都是一知半解。今天索性google了很多資料,先上sun的官網去看session的文件了解一些方法,又找了別人關於session的看法。

總結如下:

1,session是什麼?  what

session經常譯為會話,以打**為例,從開始撥號到結束通話**就是你會話的生存週期。

2,session 做什麼用的  why?

首先舉個例子:

咖啡店舉行 消費滿5杯咖啡贈送一杯的活動,可每個人一次消費5杯的時候非常少。這時候有3種辦法:

1,店員看到每個顧客時都能記住其消費了多少杯,從而給其優惠,這是協議本身具有狀態

2,給每個顧客乙個卡片,上面記錄顧客的每次消費,這是客戶端儲存狀態

3,給每個顧客乙個卡片,卡片上只有乙個編號,顧客每次的消費記錄在店裡,這就是 服務端有狀態

而http本身是無狀態的,所以我們只能使用2,3中方法,來儲存一些資訊。

實際採用的是第3種方法,伺服器段儲存一次會話所有的資訊,並生成乙個唯一的id,這個id沒有規律而且不會重複,將這個id傳回到客戶段,儲存到cookie中。每次訪問伺服器時,客戶端都會偷偷將這個id傳到伺服器,伺服器根據id查到這次會話儲存的內容。就能實現會話中共享一些資料。

3,session怎樣建立和銷毀 ? how

session是儲存在記憶體中的,所以會有一些效能上的影響。因此本著這個原則,session是只有在使用到的時候才會被建立,如果始終沒有用到session,這個session是永遠不會被建立的。

比如: 訪問servlet ,只要你**中沒有 request.getsession()或request.getsession(true);這兩行是等價的,那session是不會建立。又 當你訪問靜態頁面時,根本不會生成servlet,所以也不會建立session。

下面解釋一些疑惑: session是第一次請求時建立的?

大家都知道 jsp是被編譯成servlet才執行的,問題就在jsp編譯的過程。

jsp中有個 這個開關表示是否建立session,當你不寫這行時,它會預設給你加上這句。所以會造成上面的疑惑。當然還有一些標籤中可能有getsession()操作,會產生一些不必要的session。

session只能在服務端銷毀,有三種途徑: 1,到達session的最大請求間隔時間時,2,session。invalidate()

3,伺服器程序當掉。

這裡也有一些疑惑: 瀏覽器關閉時,session就會登出。

首先瀏覽器關閉時,瀏覽器並沒有給伺服器傳送任何訊息,所以伺服器不會知道瀏覽器何時關閉了。

上面我們知道取得session 是因為瀏覽器cookie中有sessionid,而普通cookie通常會是會話cookie,也就是說瀏覽器關閉時,這個cookie會被登出,所以當你再訪問伺服器時就沒有sessionid了,所以造成session關閉了的假象,如果暱稱通過特殊方法將sessionid傳遞給伺服器,你會發現session還在。

如果想讓cookie儲存時間長一些,就需要手動指定cookie的過期時間

4,實際專案中的難點:

1,瀏覽器禁用cookie

這就沒辦法儲存sessionid了,可以採用url重寫,**,加隱藏欄位等方法來將sessionid傳給伺服器。

如:  baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf?asdfasdf

這根據伺服器的不同實現,第一種可以將普通引數區分開。

2,多人共用session的問題

例: a 訪問 baidu.com ,但他沒有帳號,於是他將連線 baidu.com/login.jsp?jsessionid=adsfasdfad(這個a的sessionid) 發給b, b登入後,a就相當於用b的帳號登入了。你們可以在在本地試試。

解決方法: 當發現通過sessionid從url指定時, 建立乙個新的session,將舊session的資訊複製到 新sessoin中,然後將新session登出。就能防止上面那種情況了。

3,乙個帳號多地方登入

比如: 你用abc帳號登入了baidu.com,有開啟了乙個瀏覽器,又用abc帳號登入了一次。當不設計敏感操作時,這無所謂,而當你做一些敏感操作時就必須禁止這樣情況,防止同時操作,造成重複操作,或者資料損壞。

解決方法: 監聽session,將username和sessionid對應起來,當username再次登入時,登出掉以前的session,儲存現在的session,這也是一種比較不錯的方案。

這是 sghcel 畫的圖,挺不錯的:

httpsession 詳細內容整理

最近在做登入和許可權控制模組,用到了session,發現session的好多方法都不熟悉,而且以前也聽說過jsessionid 之類session竊取的事,對這些一直都是一知半解。今天索性google了很多資料,先上sun的官網去看session的文件了解一些方法,又找了 別人關於session的看...

dockerfile內容詳細

1.注釋部分,類似說明,開頭 2.基礎映象資訊 from開頭 from image tag 3.維護者資訊 maintainer開頭 maintainer user user example.com 4.構建指令 指定的操作不會在執行的image容器上執行,run開頭 run command 5.設...

HttpSession 資料同步

1 第一種方式,把物件的屬性定義為immutable,synchronized同步更新 public class highscore public playerscore gethighscore public void updatehighscore playerscore newscore or...