我相信你的問題存在誤解。會話和數據庫扮演不同的角色,即使他們都是數據存儲。會話是一個臨時存儲,而數據庫是永久存儲。數據保留在數據庫中,直到您明確將其刪除,但會話有過期日期。數據庫和會話之間還有另一個主要區別,叫做session-id。 Session-id是將HTTP請求與服務器上的相應會話數據相關聯的一種方式。會話ids通常在網絡服務器和瀏覽器之間來回傳輸,作爲一個cookie。以下是關於會話如何工作的典型場景:
瀏覽器的第一個請求已到達Web服務器。服務器上的軟件處理傳入請求,並發現它不包含會話標識(因爲它是第一個請求)。所以爲這個請求創建一個隨機生成的唯一session-id,並通過響應發送回客戶端(不管它可能是什麼)。服務器上還創建了一個與新創建的會話ID關聯的存儲。
用戶要求在同一臺服務器上有另一頁。這一次,當請求到達服務器時,它帶有一個會話ID,所以不是爲這個請求創建一個新的會話ID,與它相關的數據被加載。如果數據由服務器上的軟件更改,則將響應發送回瀏覽器時將其存儲回存儲器。
從現在開始,每個發送到Web服務器的請求都會加載相同的會話數據。除非將會話數據或會話標識從服務器中刪除,否則此過程將繼續。
在解釋的場景中,會話用於保持與請求相關聯的數據。會話數據的主要功能之一是存儲用戶的憑證數據。以下是另一種場景:
用戶打開網站的第一頁。會話ID是爲他創建的,併發送回他的瀏覽器。
用戶轉到登錄頁面並填寫表單並按下提交按鈕。
登錄請求已到達服務器。用戶名和密碼是互相檢查的,如果驗證,會話數據中提到此會話ID屬於哪個用戶。
從現在起,到達服務器的每個請求都會加載會話數據,其中包含此請求來自哪裏,並且與數據庫無關(除非將數據庫用作會話數據存儲)。
這遲到的情況被稱爲authentication
,如果請求來自他們是誰聲稱,他們都來自這意味着驗證。在普通情況下,一旦用戶被認證,就不需要再次認證他(除非會話被破壞)。就驗證而言,只有部分數據庫使用是必需的,因爲您需要檢查用戶名和密碼。
此外,還有另一種情況authorization
。在這種情況下,你知道誰在問什麼,唯一剩下的就是檢查他是否被允許執行。您知道誰在問,因爲您在會話數據中加入了傳入請求的會話ID的驗證憑據。授權可以分爲兩種類型。首先,您可以檢查並查看是否允許用戶執行請求的操作。其次,您可能需要進一步檢查並查看是否允許用戶對請求的數據執行請求的操作。第一種類型是圖書館的目的,稱爲ACL
(訪問控制列表),第二種類型通常在每個項目中分別實施。
ACL是一個函數(簡單來說),它接受請求者用戶和請求的動作(稱爲resource
)並返回一個布爾值,指示是否允許用戶執行操作。確切地說,資源可以是複合的(如Files_Delete
或Files_Read
)。 ACL功能需要說明誰可以做什麼。大多數開發人員在永久存儲(如數據庫)中加載此數據,因爲用戶已通過身份驗證並將其存儲在會話數據中,以防止從數據庫重新加載該數據。這是可能的,因爲ACL數據並不那麼大,並且可以將它存儲在會話中。因此,通常使用ACL進行授權不需要任何數據庫訪問權限(創建後)。
剩下的唯一討論就是當您要檢查請求者是否允許請求的數據請求的操作。通常在這裏通過數據來表示數據庫的記錄,通常有很多記錄。因此,將大量數據存儲在數據庫本身以外的任何地方都是不合邏輯的。而且由於它已經在數據庫中,所以沒有比SQL更適合查詢誰可以在哪條記錄上做什麼的工具。這是您需要訪問數據庫以驗證用戶請求授權的位置。但在所有其他場景中,會話數據就足夠了。
總之,在所有解釋的場景中,只有一個需要數據庫訪問。其他人只能使用會話數據來完成。
您的數據庫是否如此之慢,以至於您真的花費很多時間來查看它?它通常不應該。 –
99%的應用程序都需要從數據庫中獲取某些用戶特定的東西。所以這不是一個額外的查找,而是一個你無法避免的單個查詢。 – arkascha
數據庫被訪問,對吧? – George