session的官方定義是:Session:在計算機中,尤爲是在網絡應用中,稱爲「會話控制」。Session 對象存儲特定用戶會話所需的屬性及配置信息。php
說白了session就是一種能夠維持服務器端的數據存儲技術。session主要有如下的這些特色:redis
1. session保存的位置是在服務器端spring
2. session通常來講是要配合cookie使用,若是是瀏覽器禁用了cookie功能,也就只可以使用URL重寫來實現session存儲的功能數據庫
3. 單純的使用session來維持用戶狀態的話,那麼當同時登陸的用戶數量較多的時候,或者存在較多的數量的session會致使查詢慢的問題後端
本質上:session技術就是一種基於後端有別於數據庫的臨時存儲數據的技術瀏覽器
Tomcat RedisSessionManager
的東西,讓全部咱們部署的 tomcat 都將 session 數據存儲到 redis 便可。
由於HTTP的無狀態性,因此咱們沒有辦法在HTTP發送請求的時候知道當前用戶的狀態,也就是好比說,當前是哪一個用戶的之類的這種信息,因此這個時候咱們須要session來標識當前的狀態tomcat
經過一個模擬用戶登陸的流程圖來初步理解session的原理,假設這個時候用戶執行登陸操做,具體的session工做流程以下:服務器
整個流程大概分紅這樣的幾步:cookie
1. 第一步將本地的cookie中的session標識和用戶名,密碼帶到後臺中網絡
2. 第二步後臺檢測有沒有對應的session標識,咱們以php爲例,那麼就是檢測有沒有接收到對應的PHPSESSID
3. 沒有的話直接生成一個新的session。有的話,檢測對應的文件是否存在而且有效
3. 失效的話,咱們須要清除session而後生成新的session。不失效,使用當前的session
看到這裏你可能對session的工做原理有一個初步的理解
session的原理圖以下:
首先咱們要在PHP的安裝目錄下面找到php.ini文件,這個文件主要的做用是對PHP進行一些配置。
1. 設置session存放在cookie中中標識的字段名,php中默認爲PHPSESSID
對應的設置爲:session.name = PHPSESSID
2. 若是客戶端禁用了cookie,能夠經過設置session.use_trans_sid來使標識的交互方式從cookie變爲url傳遞
對應的設置爲: session.use_trans_sid = 0
3. 設置session的保存位置
對應的設置是session.save_path="D:\phpStudy\PHPTutorial\tmp\tmp"
1.關閉瀏覽器session一樣存在
若是咱們沒有人爲的去設置cookie的生命週期的時候默認關閉瀏覽器session的狀態是沒法被保存下來的,由於沒有設置cookie的生命週期,默認這個時候cookie爲session cookie也就是在會話存在的時候cookie纔有效,因此關閉瀏覽器cookie失效,致使後端拿不到對應的PHPSESSID,因此沒法找到對應的session文件。
2.session性能瓶頸怎樣解決?
若是是後端存在大量的session的時候,那麼這個時候就會出現性能的瓶頸,例如:當後端同時存在有5000個session文件的時候,假設要找的文件是在第4999個,那麼也就是說前面至少須要遍歷4998次,這樣就會浪費過多的時間在後端的循環遍歷查找文件中,因此這個時候最有效的方法是使用redis,原理是經過將本來保存在本地的session文件寫入到內存中,經過內存換空間的形式來達到提高速度。
3. 通常不使用URL重寫的方法來傳遞PHPSESSID
其中主要有兩個緣由,一個是URL重寫方式傳遞的話會致使URL混亂,影響美觀。另外一個是增大了用戶誤操做的概率。