摘要:在Javaweb開發(fā)過程中,為便于多個頁面之間信息的共享,經(jīng)常會使用Session內(nèi)置對象在多個頁面之間進行會話。本文從內(nèi)置對象Session誕生開始,簡要介紹其運行機理,并對其常用函數(shù)進行分析與仿真,便于讀者深入理解其內(nèi)部機制并更好的利用此類函數(shù)。
關鍵詞:Session;Cookie;仿真;信息共享
1 概述
web應用允許多個客戶端同時訪問,為實現(xiàn)不同用戶之間的信息共享,又要保證不同用戶之間信息互不影響,這時常常會用到內(nèi)置對象Session。那么內(nèi)置對象Session是如何對不同用戶中的共享變量進行操作的呢?不同用戶之間的信息如何保證互不影響的呢?每個用戶對web應用的訪問都是由多個請求和響應頁面組成的,那么如何在地址改變的情況下操作多頁面間的共享變量呢?
2 Session與Cookie
當我們從瀏覽器打開一個頁面時,都會用到HTTP協(xié)議,然而HTTP協(xié)議是一種無狀態(tài)協(xié)議。服務器不會保留請求的任何信息,下一次客戶端進行請求時,服務器沒有方法可以將它與其他客戶端區(qū)別開來,這就是Http的協(xié)議無狀態(tài)性。[1]那么應如何實現(xiàn)對不同地址的頁面進行信息共享。為解決此問題Cookie誕生了。Cookie是一種客戶端存儲數(shù)據(jù)方式,將少量信息存儲在本地以實現(xiàn)不同頁面之間共享到相同信息。但是Cookie存在于客戶端,并且它本身存儲大小也有限,可以隨意的修改,很不安全。此時一種新的存儲會話機制Session應運而生。Cookie機制采用的是在客戶端保持狀態(tài)的方案.而Session機制采用的是在服務器端保持狀態(tài)的方案。[2]
3 Session機制與常用函數(shù)
3.1 運行機制
Session是用來保持不同用戶狀態(tài)并基于Web服務器的會話方法。Session允許不同用戶基于Web服務器內(nèi)存在整個用戶會話過程中保持任何對象。
一個會話開始時,Servlet容器為HttpSession分配唯一一個標識符,稱為Session ID,Servlet容器把Session ID作為cookie保存在客戶端瀏覽器中,每次客戶發(fā)送Http請求時,Servlet容器可以從HttpServletRequest對象中讀取Session ID,并根據(jù)Session ID找到相應的HttpSession對象,從而獲取客戶的狀態(tài)信息。Session通過getID的方式產(chǎn)生一個Session ID,并通過Cookie的形式寫入客戶端,客戶端再通過請求,將該ID返回給服務器端,因此服務器就知道與客戶端對應的Session對象是哪一個。當客戶第一次訪問Web應用中支持Session的某個頁面時,就會創(chuàng)建一個新的Session。由于Session過多會給服務器造成超大負荷,因此產(chǎn)生了Session的生命周期的概念,Servlet容器會在生命周期結束時將Session所占用的資源釋放掉。
3.2 常用函數(shù)
其最常用的方法有void setAttribute(String,Object)和Object getAttribute(String),以實現(xiàn)不同頁面之間變量的保存和獲取。下文中將對這兩個函數(shù)進行仿真,以便學習者對Sesison有更深一步的認識和理解。
4 session的仿真
其實在JAVA中Session的實現(xiàn)是基于多級聯(lián)的Map容器。首先建立一個Java類MySession來模擬web中的Session。因為要實現(xiàn)仿真,在兩個函數(shù)的參數(shù)列表中分別多加一個參數(shù)來實現(xiàn)對不同用戶信息的存儲,由此先得到仿真函數(shù)雛形:
static Map
static void setAttribute(String client,String key,Object value)
{
Map
if(client0 == null)
{
client0 = new HashMap();
client0.put(client,client0);
}
else
client0.put(key,value);
}
static Object getAttribute(String client,String key)
{
Map
if(client0 == null)
return null;
return client0.get(key);
}
對于一個基于JAVA技術的多線程仿真機制來講,需要由Java來提供線程組類,線程管理和控制的方法則需要由線程組來提供,便于開發(fā)人員開發(fā)。[3]基于此,利用Java多線程配合不同瀏覽器模擬多個用戶使用web同一應用實現(xiàn)不同頁面的信息存儲。
5 結語
實際上,我們經(jīng)常使用的函數(shù)都是基于簡單的知識點拼接而成。本次仿真也是如此,首先了解Session的產(chǎn)生背景,通過產(chǎn)生的背景發(fā)現(xiàn)機制的本質(zhì)。其次掌握Session的主要用途,經(jīng)過仿真,我們能夠深入理解,更能更好的使用此機制。
參考文獻:
[1]冉春玉,陳建軍.基于JSP/Servlet的Http協(xié)議無狀態(tài)性解決方案.武漢理工大學學報,2003,25(1):77-80.
[2]張瑞興,張翠梅.Cookie和Session機制的初步探討.考試周刊,2008,(36):170-171.
[3]盧鳳偉.Java技術的發(fā)展趨勢分析.數(shù)字通信世界,2017,(5):101-102.
作者簡介:汪美(1998-),女,漢族,遼寧阜新人,本科,研究方向:計算機科學。