Session(會話控制)


Session概念:

    Session在計算機中,尤其是在網絡應用中,稱為"會話控制"。Session 對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web 頁時,如果該用戶還沒有會話,則 Web 服務器將自動創建一個 Session 對象。當會話過期或被放棄后,服務器將終止該會話。Session 對象最常見的一個用法就是存儲用戶的首選項。例如,如果用戶指明不喜歡查看圖形,就可以將該信息存儲在 Session 對象中。

    Session直接翻譯成中文比較困難,一般都譯成時域。在計算機專業術語中,Session是指一個終端用戶與交互系統進行通信的時間間隔,通常指從注冊進入系統到注銷退出系統之間所經過的時間。以及如果需要的話,可能還有一定的操作空間。

    需要注意的是,一個Session的概念需要包括特定的客戶端,特定的服務器端以及不中斷的操作時間。A用戶和C服務器建立連接時所處的Session同B用戶和C服務器建立連接時所處的Session是兩個不同的Session。

session的工作原理:

    (1)當一個session第一次被啟用時,一個唯一的標識被存儲於本地的cookie中。

    (2)首先使用session_start()函數,PHP從session倉庫中加載已經存儲的session變量。

    (3)當執行PHP腳本時,通過使用session_register()函數注冊session變量。

    (4)當PHP腳本執行結束時,未被銷毀的session變量會被自動保存在本地一定路徑下的session庫中,這個路徑可以通過php.ini文件中的session.save_path指定,下次瀏覽網頁時可以加載使用。

session的使用方法:

    Session 是 用於保持狀態的基於 Web服務器的方法。Session 允許通過將對象存儲在 Web服務器的內存中在整個用戶會話過程中保持任何對象。

    Session 通常用於執行以下操作:

        存儲需要在整個用戶會話過程中保持其狀態的信息,例如登錄信息或用戶瀏覽 Web應用程序時需要的其它信息。

        存儲只需要在頁面重新加載過程中或按功能分組的一組頁之間保持其狀態的對象。

        Session 的作用就是它在 Web服務器上保持用戶的狀態信息供在任何時間從任何設備上的頁面進行訪問。因為瀏覽器不需要存儲任何這種信息,所以可以使用任何瀏覽器,即使是像 Pad 或手機這樣的瀏覽器設備。

    持久性方法的限制:

        隨着越來越多用戶登錄,Session 所需要的服務器內存量也會不斷增加。

        訪問 Web應用程序的每個用戶都生成一個單獨的 Session 對象。每個 Session 對象的持續時間是用戶訪問的時間加上不活動的時間。

        如果每個 Session 中保持許多對象,並且許多用戶同時使用 Web應用程序(創建許多 Session),則用於 Session 持久性的服務器內存量可能會很大,從而影響了可伸縮性。

php中的Session與Cookie:

    在PHP開發中對比起Cookie,session 是存儲在服務器端的會話,相對安全,並且不像 Cookie 那樣有存儲長度限制,本文簡單介紹 session 的使用。

    由於 Session 是以文本文件形式存儲在服務器端的,所以不怕客戶端修改 Session 內容。實際上在服務器端的 Session 文件,PHP 自動修改 session 文件的權限,只保留了系統讀和寫權限,而且不能通過 ftp 修改,所以安全得多。

    對於 Cookie 來說,假設我們要驗證用戶是否登陸,就必須在 Cookie 中保存用戶名和密碼(可能是 md5 加密后字符串),並在每次請求頁面的時候進行驗證。如果用戶名和密碼存儲在數據庫,每次都要執行一次數據庫查詢,給數據庫造成多余的負擔。因為我們並不能只做一次驗證。為什么呢?因為客戶端Cookie 中的信息是有可能被修改的。假如你存儲 $admin變量來表示用戶是否登陸,$admin 為 true 的時候表示登陸,為 false 的時候表示未登錄,在第一次通過驗證后將 $admin 等於 true 存儲在 Cookie,下次就不用驗證了,這樣對么?錯了,假如有人偽造一個值為 true 的 $admin 變量那不是就立即取的了管理權限么?非常的不安全。

    而 Session 就不同了,Session 是存儲在服務器端的,遠程用戶沒辦法修改 session 文件的內容,因此我們可以單純存儲一個 $admin變量來判斷是否登陸,首次驗證通過后設置 $admin 值為 true,以后判斷該值是否為 true,假如不是,轉入登陸界面,這樣就可以減少很多數據庫操作了。而且可以減少每次為了驗證 Cookie 而傳遞密碼的不安全性了(session 驗證只需要傳遞一次,假如你沒有使用 SSL 安全協議的話)。即使密碼進行了 md5 加密,也是很容易被截獲的。

    當然使用 session 還有很多優點,比如控制容易,可以按照用戶自定義存儲等(存儲於數據庫)。

    session 在 php.ini 是否需要設置呢?一般不需要的,因為並不是每個人都有修改 PHP.ini 的權限,默認 session 的存放路徑是服務器的系統臨時文件夾,我們可以自定義存放在自己的文件夾里。

Session有以下的特點:

    1,不是現存安全的,應該避免多個線程共享同一個Session實例

    2,Session實例是輕量級的,所謂輕量級:是指他的創建和刪除不需要消耗太多資源

    3,Session對象內部有一個緩存,被稱為Hibernate第一緩存,他存放被當前工作單元中加載的對象,每個Session實例都有自己的緩存。

Sessiond的缺陷:

    目前ASP的開發人員都正在使用Session這一強大的功能,但是在他們使用的過程中卻發現了ASP Session有以下缺陷:

    進程依賴性

    ASP Session狀態存於IIS的進程中,也就是inetinfo.exe這個程序。所以當inetinfo.exe進程崩潰時,這些信息也就丟失。另外,重起或者關閉IIS服務都會造成信息的丟失。

    Session狀態使用范圍的局限性

    當一個用戶從一個網站訪問到另外一個網站時,這些Session信息並不會隨之遷移過去。例如:新浪網站的WWW服務器可能不止一個,一個用戶登錄之后要去各個頻道瀏覽,但是每個頻道都在不同的服務器上,如果想在這些WWW服務器共享Session信息怎么辦呢

Cookie的依賴性:

    實際上客戶端的Session信息是存儲在Cookie中的,如果客戶端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。

    鑒於ASP Session的以上缺陷,微軟的設計者們在設計開發 ASP .NET Session時進行了相應的改進,完全克服了以上缺陷,使得ASP .NET Session成為了一個更加強大的功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM