嫣雨江南

          -----最憶蘇州
          posts - 3, comments - 1, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          WEB應(yīng)用中的SESSION知多少?

          Posted on 2010-01-27 15:38 java小P孩 閱讀(1923) 評(píng)論(1)  編輯  收藏 所屬分類: Java?

              作為一名WEB開發(fā)程序員,對(duì)session的理解是最基礎(chǔ)的,但是現(xiàn)狀是WEB程序員遍地都是,隨便一劃拉一大把,不過估計(jì)能把session能透徹理解的人應(yīng)該不是很多,起碼我之前對(duì)此是知之甚少,偶然看到的一個(gè)關(guān)于session的文章,經(jīng)過適當(dāng)整理,特拿來與大家分享,因?yàn)闀r(shí)間太久,文章出處已然記不清楚,無法附上,請(qǐng)?jiān)骼斫猓粲斜匾視?huì)刪除,謝謝!

          目 錄
          一、Session
          二、Cookies
          三、Cookies機(jī)制
          四、Session機(jī)制
          五、Cookies機(jī)制與Session機(jī)制的區(qū)別和聯(lián)系
          六、常見問題
          七、Session的用法

          Session是WEB上有效的信息交互手段,因其使用方便、穩(wěn)定、安全、可靠而被眾多WEB開發(fā)者所認(rèn)知。尤其在互聯(lián)網(wǎng)身份驗(yàn)證、網(wǎng)上電子購(gòu)物等方面的應(yīng)用更為廣泛。下面就著重來介紹下Session。

          一、Session
          Session,在漢語(yǔ)中表示通話、會(huì)話、對(duì)話(期)、話路[對(duì)談時(shí)間]的意思,其本來的含義一個(gè)終端用戶與交互系統(tǒng)進(jìn)行通信的時(shí)間(間隔),通常是指從注冊(cè)(進(jìn)入系統(tǒng))到注銷(退出系統(tǒng))之間所經(jīng)過的時(shí)間。比如打電話時(shí)從拿起電話撥號(hào)到掛斷電話這中間的一系列過程可以稱之為一個(gè)Session。有時(shí)候我們可以看到這樣的話“在一個(gè)瀏覽器會(huì)話期間,…”,這里的會(huì)話一詞用的就是這個(gè)意思,是指從一個(gè)瀏覽器窗口打開到關(guān)閉這個(gè)期間。Session在我們的網(wǎng)絡(luò)應(yīng)用中就是一種客戶端與服務(wù)器端保持狀態(tài)的解決方案,有時(shí)候Session也用來指這種解決方案的存儲(chǔ)結(jié)構(gòu),
          Session對(duì)象,就是客戶端瀏覽器與服務(wù)器之間建立的互動(dòng)信息狀態(tài)。每一個(gè)不同的用戶連接將得到不同的Session,也就是說Session與用戶之間是一種一對(duì)一的關(guān)系。Session在用戶進(jìn)入網(wǎng)站時(shí)由服務(wù)器自動(dòng)產(chǎn)生,并在用戶正常離開站點(diǎn)時(shí)釋放。使用Session的好處就在于,可以將很多與用戶相關(guān)的信息,例如用戶的帳號(hào)、昵稱等保存到Session中;利用Session,可以跟蹤用戶在網(wǎng)站上的活動(dòng)。例如:當(dāng)你上網(wǎng)進(jìn)入一個(gè)網(wǎng)站時(shí),如果你沒有登陸,無論你訪問哪幾個(gè)頁(yè)面都會(huì)跳轉(zhuǎn)回登陸頁(yè)。還有就是你在購(gòu)物時(shí),不可能把你的東西放到別人的購(gòu)物車?yán)锶ィ@就得用一個(gè)信息變量來判斷!
          如果能夠提供一些按需生成的動(dòng)態(tài)信息會(huì)使web變得更加有用,就像給有線電視加上點(diǎn)播功能一樣。這種需求一方面迫使HTML逐步添加了表單、腳本、DOM等客戶端行為,另一方面在服務(wù)器端則出現(xiàn)了CGI規(guī)范以響應(yīng)客戶端的動(dòng)態(tài)請(qǐng)求,作為傳輸載體的HTTP協(xié)議也添加了文件上載、cookie這些特性。其中cookie的作用就是為了解決HTTP協(xié)議無狀態(tài)的缺陷所作出的努力。至于后來出現(xiàn)的Session機(jī)制則是又一種在客戶端與服務(wù)器之間保持狀態(tài)的解決方案。

          二、Cookies
          Cookie是WEB上最常用的跟蹤用戶會(huì)話方式,當(dāng)  Cookie被禁止后,一般都用URL重寫來跟蹤會(huì)話。Cookie是一種由服務(wù)器發(fā)送給客戶的片段信息,存儲(chǔ)在客戶環(huán)境中,并在客戶所有的對(duì)服務(wù)器的請(qǐng)求中都要發(fā)回它。就好比我們?cè)谟肐E登陸某個(gè)電子購(gòu)物商城時(shí),IE在得到商品列表頁(yè)面的 同時(shí)還收到Set-Cookie應(yīng)答頭信息,我們打開一個(gè)Cookie文件,我們所看到的格式一般都是:
          Cookie:NAME=VALUE;Comment=COMMENT;Domain=DOMAINNMAM;Max-age=SECONDS;Path=PATH;secure;Version=1*DIGIT
          其中NAME值對(duì)(值對(duì)間用分號(hào)分隔)是必須的,其余都是可選的。最重要的信息當(dāng)然也在所必須的值對(duì)里了,VALUE是NAME的值,也是這個(gè)Cookie的標(biāo)識(shí),Max-age定義了Cookie的最長(zhǎng)生存時(shí)間,其它幾個(gè)可選值對(duì)可參閱http://www.faqs.org/rfcs/rfc2109.html。當(dāng)我們選購(gòu)了某種商品,向服務(wù)器發(fā)送選購(gòu)清單時(shí),會(huì)自動(dòng)在你的請(qǐng)求信息頭里加上NAME值對(duì),如果Cookie被禁止,則用URL重寫方式在URL請(qǐng)求地址上附加NAME值對(duì)。當(dāng)Web服務(wù)器收到這個(gè)請(qǐng)求后,會(huì)檢查該Cookie是否存在,然后相應(yīng)的跟蹤會(huì)話。從以上分析不難理解,其實(shí)Web服務(wù)器跟蹤會(huì)話就靠Set-Cookie頭信息,跟蹤NAME值對(duì)進(jìn)行身份驗(yàn)證。假如我們用非Web終端接收Web服務(wù)器的響應(yīng)信息,從中解析出Cookie頭信息,當(dāng)再次向Web服務(wù)器發(fā)送請(qǐng)求時(shí)附加上解析出的Cookie信息,Web服務(wù)器據(jù)此不就可以進(jìn)行身份認(rèn)證了嗎?
          Cookies中文是餅干的意思,對(duì)于為何引用Cookies,從網(wǎng)上查找了一些資料:
          在瀏覽器與WEB服務(wù)器之間是使用HTTP協(xié)議進(jìn)行通信的,當(dāng)某個(gè)用戶發(fā)出頁(yè)面請(qǐng)求時(shí),WEB服務(wù)器只是簡(jiǎn)單的進(jìn)行響應(yīng),然后就關(guān)閉與該用戶的連接。因此當(dāng)一個(gè)請(qǐng)求發(fā)送到WEB服務(wù)器時(shí),無論其是否是第一次來訪,服務(wù)器都會(huì)把它當(dāng)作第一次來對(duì)待,這樣的不好之處可想而知。為了彌補(bǔ)這個(gè)缺陷,Netscape開發(fā)出了cookie這個(gè)有效的工具來保存某個(gè)用戶的識(shí)別信息,因此人們昵稱為“小甜餅”。cookies是一種WEB服務(wù)器通過瀏覽器在訪問者的硬盤上存儲(chǔ)信息的手段:Netscape Navigator使用一個(gè)名為cookies.txt本地文件保存從所有站點(diǎn)接收的Cookie信息;而IE瀏覽器把Cookie信息保存在類似于c:\Internet 臨時(shí)文件\的目錄下。當(dāng)用戶再次訪問某個(gè)站點(diǎn)時(shí),服務(wù)端將要求瀏覽器查找并返回先前發(fā)送的Cookie信息,來識(shí)別這個(gè)用戶。Cookies給網(wǎng)站和用戶帶來的好處:
            (1)、Cookie能使站點(diǎn)跟蹤特定訪問者的訪問次數(shù)、最后訪問時(shí)間和訪問者進(jìn)入站點(diǎn)的路徑
            (2)、Cookie能告訴在線廣告商廣告被點(diǎn)擊的次數(shù),從而可以更精確的投放廣告
            (3)、Cookie有效期限未到時(shí),Cookie能使用戶在不鍵入密碼和用戶名的情況下進(jìn)入曾經(jīng)瀏覽過的一些站點(diǎn)
                 (4)、Cookie能幫助站點(diǎn)統(tǒng)計(jì)用戶個(gè)人資料以實(shí)現(xiàn)各種各樣的個(gè)性化服務(wù),其實(shí),cookie的作用就是為了解決HTTP協(xié)議無狀態(tài)的缺陷所作的努力.

          三.Cookie機(jī)制
          Cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案。
          Cookie機(jī)制,就是當(dāng)服務(wù)器對(duì)訪問它的用戶生成了一個(gè)Session的同時(shí)服務(wù)器通過在HTTP的響應(yīng)頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應(yīng)的cookie,保存在客戶端,里面記錄著用戶當(dāng)前的信息,當(dāng)用戶再次訪問服務(wù)器時(shí),瀏覽器檢查所有存儲(chǔ)的cookie,如果某個(gè)cookie所聲明的作用范圍大于等于將要請(qǐng)求的資源所在的位置也就是對(duì)應(yīng)的Cookie文件。 若存在,則把該cookie附在請(qǐng)求資源的HTTP請(qǐng)求頭上發(fā)送給服務(wù)器,例如:當(dāng)我們登陸了一個(gè)網(wǎng)站,并且填寫了有關(guān)資料,以本站會(huì)員的名義登陸上了有關(guān)網(wǎng)頁(yè),這時(shí)你把瀏覽器關(guān)閉,再重啟進(jìn)入該網(wǎng)站的某一個(gè)頁(yè)面時(shí)是以你登陸過的會(huì)員進(jìn)去的,當(dāng)然,不是所有網(wǎng)站都是這樣,我們知道,cookie的保存有臨時(shí)性的和持久性的,大多都是臨時(shí)性的,也就是cookie只保存在客戶端的內(nèi)存中,而沒有保存在硬盤上,當(dāng)關(guān)閉瀏覽器,cookie也就銷毀。以下是有關(guān)cookie機(jī)制的一些具體說明:
          cookie的內(nèi)容主要包括:名字,值,過期時(shí)間,路徑和域。
          其中域可以指定某一個(gè)域比如.google.com,相當(dāng)于總店招牌,比如寶潔公司,也可以指定一個(gè)域下的具體某臺(tái)機(jī)器比如www.google.com或者froogle.google.com,可以用飄柔來做比。
          路徑就是跟在域名后面的URL路徑,比如/或者/foo等等,可以用某飄柔專柜做比。路徑與域合在一起就構(gòu)成了cookie的作用范圍。
          如果不設(shè)置過期時(shí)間,則表示這個(gè)cookie的生命期為瀏覽器會(huì)話期間,只要關(guān)閉瀏覽器窗口,cookie就消失了。這種生命期為瀏覽器會(huì)話期的 cookie被稱為會(huì)話cookie。會(huì)話cookie一般不存儲(chǔ)在硬盤上而是保存在內(nèi)存里,當(dāng)然這種行為并不是規(guī)范規(guī)定的。如果設(shè)置了過期時(shí)間,瀏覽器就會(huì)把cookie保存到硬盤上,關(guān)閉后再次打開瀏覽器,這些cookie仍然有效直到超過設(shè)定的過期時(shí)間。
          存儲(chǔ)在硬盤上的cookie可以在不同的瀏覽器進(jìn)程間共享,比如兩個(gè)IE窗口。而對(duì)于保存在內(nèi)存里的cookie,不同的瀏覽器有不同的處理方式。對(duì)于微軟的IE瀏覽器,在一個(gè)打開的窗口上按Ctrl-N(或者從文件菜單)打開的窗口可以與原窗口共享,而使用其他方式新開的IE進(jìn)程則不能共享已經(jīng)打開的窗口的內(nèi)存cookie;對(duì)于火狐貍firefox瀏覽器,所有的進(jìn)程和標(biāo)簽頁(yè)都可以共享同樣的cookie。一般來說是用javascript的window.open打開的窗口會(huì)與原窗口共享內(nèi)存cookie。瀏覽器對(duì)于會(huì)話cookie的這種只認(rèn)cookie不認(rèn)人的處理方式經(jīng)常給采用Session機(jī)制的web應(yīng)用程序開發(fā)者造成很大的困擾。

          四、Session機(jī)制
          Session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案。
          當(dāng)用戶訪問到一個(gè)服務(wù)器,服務(wù)器就要為該用戶創(chuàng)建一個(gè)SESSION,在創(chuàng)建這個(gè)SESSION的時(shí)候,服務(wù)器首先檢查這個(gè)用戶發(fā)來的請(qǐng)求里是否包含了一個(gè)SESSIONID,如果包含了一個(gè)SESSIONID則說明之前該用戶已經(jīng)登陸過并為此用戶創(chuàng)建過SESSION,那服務(wù)器就按照這個(gè)SESSIONID把這個(gè)SESSION在服務(wù)器的內(nèi)存中查找出來(如果查找不到,就有可能為他新創(chuàng)建一個(gè)),如果客戶端請(qǐng)求里不包含有SESSIONID,則為該客戶端創(chuàng)建一個(gè)SESSION并生成一個(gè)與此SESSION相關(guān)的SESSIONID。這個(gè)SESSIONID是唯一的、不重復(fù)的、不容易找到規(guī)律的字符串,這個(gè)SESSIONID將被在本次響應(yīng)中返回到客戶端保存,而保存這個(gè)SESSIONID的正是COOKIE,這樣在交互過程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)送給服務(wù)器。
          我們知道在IE中,我們可以在工具的internet選項(xiàng)中把COOKIE禁止,那么會(huì)不會(huì)出現(xiàn)把客戶端的COOKIE禁止了,SESSIONID就無法再用了呢?找了一些資料說明,可以有其他機(jī)制在COOKIE被禁止時(shí)仍然能夠把Session id傳遞回服務(wù)器。經(jīng)常被使用的一種技術(shù)叫做URL重寫,就是把Session id直接附加在URL路徑的后面一種是作為URL路徑的附加信息,表現(xiàn)形式為:
          http://…./xxx;jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764;
          另一種是作為查詢字符串附加在URL后面,表現(xiàn)形式為:
          http://…../xxx?jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
          還有一種就是表單隱藏字段。就是服務(wù)器會(huì)自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把Session id傳遞回服務(wù)器。這里就不介紹了。
          我們常說的在一個(gè)IE被打開是創(chuàng)建一個(gè)Session,當(dāng)關(guān)閉IE時(shí)Session也就被刪除,事實(shí)上,除非程序通知服務(wù)器刪除Session,否則Session會(huì)被服務(wù)器一直保留,直到Session的失效時(shí)間到了自動(dòng)刪除。服務(wù)器不知道IE被關(guān)閉,IE不會(huì)主動(dòng)在其關(guān)閉之前通知服務(wù)器它將要關(guān)閉。程序一般都是在用戶做注銷時(shí)刪除Session。我們產(chǎn)生這種錯(cuò)覺的原因是:一般Session機(jī)制都使用cookie來保存Session id,而一旦關(guān)閉IE瀏覽器,Session id就不存在了,再連接服務(wù)器時(shí)找不到原來的Session了.如果服務(wù)器設(shè)置的cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發(fā)出的 HTTP請(qǐng)求頭,把原來的Session id發(fā)送給服務(wù)器,則再次打開瀏覽器仍然能夠找到原來的Session。恰恰是由于關(guān)閉瀏覽器不會(huì)導(dǎo)致Session被刪除,迫使服務(wù)器為seesion設(shè)置了一個(gè)失效時(shí)間,當(dāng)距離客戶端上一次使用Session的時(shí)間超過這個(gè)失效時(shí)間時(shí),服務(wù)器就可以認(rèn)為客戶端已經(jīng)停止了活動(dòng),才會(huì)把Session刪除以節(jié)省存儲(chǔ)空間。
          一般情況下,Session都是存儲(chǔ)在內(nèi)存里,當(dāng)服務(wù)器進(jìn)程被停止或者重啟的時(shí)候,內(nèi)存里的Session也會(huì)被清空,如果設(shè)置了Session的持久化特性,服務(wù)器就會(huì)把Session保存到硬盤上,當(dāng)服務(wù)器進(jìn)程重新啟動(dòng)或這些信息將能夠被再次使用。

          五、cookie機(jī)制與Session機(jī)制的區(qū)別和聯(lián)系
          具體來說cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,而Session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案。同時(shí)我們也看到,由于在服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識(shí),所以Session機(jī)制可能需要借助于cookie機(jī)制來達(dá)到保存標(biāo)識(shí)的目的,但實(shí)際上還有其他選擇。例如,我們經(jīng)常用到的會(huì)員卡,也就相當(dāng)于這種情況。消費(fèi)到了一定程度就有獎(jiǎng),就如下面例子說明:
          1.發(fā)給顧客一張卡片,上面記錄著消費(fèi)的數(shù)量,一般還有個(gè)有效期限。每次消費(fèi)時(shí),如果顧客出示這張卡片,則此次消費(fèi)就會(huì)與以前或以后的消費(fèi)相聯(lián)系起來。這種做法就是在客戶端保持狀態(tài)。
          2、發(fā)給顧客一張會(huì)員卡,除了卡號(hào)之外什么信息也不紀(jì)錄,每次消費(fèi)時(shí),如果顧客出示該卡片,則店員在店里的紀(jì)錄本上找到這個(gè)卡號(hào)對(duì)應(yīng)的紀(jì)錄添加一些消費(fèi)信息。這種做法就是在服務(wù)器端保持狀態(tài)。
          以下是一些關(guān)于兩者的區(qū)別與聯(lián)系:
          具體來說cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案。它是在用戶端的會(huì)話狀態(tài)的存貯機(jī)制,他需要用戶打開客戶端的cookie支持。cookie的作用就是為了解決HTTP協(xié)議無狀態(tài)的缺陷所作的努力.而Session機(jī)制采用的是一種在客戶端與服務(wù)器之間保持狀態(tài)的解決方案。同時(shí)我們也看到,由于采用服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識(shí),所以Session機(jī)制可能需要借助于cookie機(jī)制來達(dá)到保存標(biāo)識(shí)的目的。而Session提供了方便管理全局變量的方式。
          Session是針對(duì)每一個(gè)用戶的,變量的值保存在服務(wù)器上,用一個(gè)Session來區(qū)分是哪個(gè)用戶Session變量,這個(gè)值是通過用戶的瀏覽器在訪問的時(shí)候返回給服務(wù)器,當(dāng)客戶禁用cookie時(shí),這個(gè)值也可能設(shè)置為由get來返回給服務(wù)器。
          就安全性來說:當(dāng)你訪問一個(gè)使用Session 的站點(diǎn),同時(shí)在自己機(jī)子上建立一個(gè)cookie,建議在服務(wù)器端的SESSION機(jī)制更安全些.因?yàn)樗粫?huì)任意讀取客戶存儲(chǔ)的信息。
          正統(tǒng)的cookie分發(fā)是通過擴(kuò)展HTTP協(xié)議來實(shí)現(xiàn)的,服務(wù)器通過在HTTP的響應(yīng)頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應(yīng)的cookie。
          從網(wǎng)絡(luò)服務(wù)器觀點(diǎn)看所有HTTP請(qǐng)求都獨(dú)立于先前請(qǐng)求。就是說每一個(gè)HTTP響應(yīng)完全依賴于相應(yīng)請(qǐng)求中包含的信息.
          狀態(tài)管理機(jī)制克服了HTTP的一些限制并允許網(wǎng)絡(luò)客戶端及服務(wù)器端維護(hù)請(qǐng)求間的關(guān)系。在這種關(guān)系維持的期間叫做會(huì)話(Session)。
          Cookies是服務(wù)器在本地機(jī)器上存儲(chǔ)的小段文本并隨每一個(gè)請(qǐng)求發(fā)送至同一個(gè)服務(wù)器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie規(guī)范。網(wǎng)絡(luò)服務(wù)器用HTTP頭向客戶端發(fā)送cookies,在客戶終端,瀏覽器解析這些cookies并將它們保存為一個(gè)本地文件,它會(huì)自動(dòng)將同一服務(wù)器的任何請(qǐng)求縛上這些cookies 。
          來看一下Tomcat是如何實(shí)現(xiàn)web應(yīng)用程序之間session的隔離的,從Tomcat設(shè)置的cookie路徑來看,它對(duì)不同的應(yīng)用程序設(shè)置的cookie路徑是不同的,這樣不同的應(yīng)用程序所用的session id是不同的,因此即使在同一個(gè)瀏覽器窗口里訪問不同的應(yīng)用程序,發(fā)送給服務(wù)器的session id也可以是不同的。

          六、常見問題
          1、Session在何時(shí)被創(chuàng)建
          Session在有客戶端訪問時(shí)就被創(chuàng)建,然而事實(shí)是直到某server端程序調(diào)用HttpServletRequest.getSession(true)這樣的語(yǔ)句時(shí)才被創(chuàng)建,注意如果JSP沒有顯示的使用 <%@page Session=”false”%> 關(guān)閉Session,則JSP文件在編譯成Servlet時(shí)將會(huì)自動(dòng)加上這樣一條語(yǔ)句HttpSession Session = HttpServletRequest.getSession(true);這也是JSP中隱含的Session對(duì)象的來歷。由于Session會(huì)消耗內(nèi)存資源,因此,如果不打算使用Session,應(yīng)該在所有的JSP中關(guān)閉它。
          2、Session何時(shí)被刪除
          綜合前面的討論,Session在下列情況下被刪除:
          a.程序調(diào)用HttpSession.invalidate();
          b.距離上一次收到客戶端發(fā)送的Session id時(shí)間間隔超過了Session的超時(shí)設(shè)置;
          c.服務(wù)器進(jìn)程被停止(非持久Session)。
          3、如何做到在瀏覽器關(guān)閉時(shí)刪除Session
          嚴(yán)格的講,做不到這一點(diǎn)。可以做一點(diǎn)努力的辦法是在所有的客戶端頁(yè)面里使用javascript代碼window.oncolose來監(jiān)視瀏覽器的關(guān)閉動(dòng)作,然后向服務(wù)器發(fā)送一個(gè)請(qǐng)求來刪除Session。但是對(duì)于瀏覽器崩潰或者強(qiáng)行殺死進(jìn)程這些非常規(guī)手段仍然無能為力。
          4、有個(gè)HttpSessionListener是怎么回事
          你可以創(chuàng)建這樣的listener去監(jiān)控Session的創(chuàng)建和銷毀事件,使得在發(fā)生這樣的事件時(shí)你可以做一些相應(yīng)的工作。注意是Session的創(chuàng)建和銷毀動(dòng)作觸發(fā)listener,而不是相反。類似的與HttpSession有關(guān)的listener還有HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。
          5、存放在Session中的對(duì)象必須是可序列化的嗎
          不是必需的。要求對(duì)象可序列化只是為了Session能夠在集群中被復(fù)制或者能夠持久保存或者在必要時(shí)server能夠暫時(shí)把Session交換出內(nèi)存。在Weblogic Server的Session中放置一個(gè)不可序列化的對(duì)象在控制臺(tái)上會(huì)收到一個(gè)警告。
          6、開兩個(gè)瀏覽器窗口訪問應(yīng)用程序會(huì)使用同一個(gè)Session還是不同的Session
          對(duì)Session來說是只認(rèn)id不認(rèn)人,因此不同的瀏覽器,不同的窗口打開方式以及不同的cookie存儲(chǔ)方式都會(huì)對(duì)這個(gè)問題的答案有影響。
          7、如何防止用戶打開兩個(gè)瀏覽器窗口操作導(dǎo)致的Session混亂
          這個(gè)問題與防止表單多次提交是類似的,可以通過設(shè)置客戶端的令牌來解決。就是在服務(wù)器每次生成一個(gè)不同的id返回給客戶端,同時(shí)保存在Session里,客戶端提交表單時(shí)必須把這個(gè)id也返回服務(wù)器,程序首先比較返回的id與保存在Session里的值是否一致,如果不一致則說明本次操作已經(jīng)被提交過了。可以參看《J2EE核心模式》關(guān)于表示層模式的部分。需要注意的是對(duì)于使用javascript window.open打開的窗口,一般不設(shè)置這個(gè)id,或者使用單獨(dú)的id,以防主窗口無法操作,建議不要再window.open打開的窗口里做修改操作,這樣就可以不用設(shè)置。
          8、為什么Session不見了
          排除Session正常失效的因素之外,服務(wù)器本身的可能性應(yīng)該是微乎其微的;理論上防火墻或者代理服務(wù)器在cookie處理上也有可能會(huì)出現(xiàn)問題。出現(xiàn)這一問題的大部分原因都是程序的錯(cuò)誤,最常見的就是在一個(gè)應(yīng)用程序中去訪問另外一個(gè)應(yīng)用程序。
          9、服務(wù)器關(guān)掉后,當(dāng)前Session會(huì)丟掉嗎
          這個(gè)取決于你使用什么樣的web服務(wù)器以及web服務(wù)器是如何配置的。tomcat在shutdown前默認(rèn)會(huì)自動(dòng)將Session保存到指定的目錄中,重新啟動(dòng)是重新加載,因此tomcat重新啟動(dòng)后,Session是可以繼續(xù)使用的。此外,你還何以將Session保存到數(shù)據(jù)庫(kù)中,這個(gè)要在server.xml中配置。
          10、Cookie的過期和Session的超時(shí)有什么區(qū)別
          會(huì)話的超時(shí)由服務(wù)器來維護(hù),它不同于Cookie的失效日期。首先,會(huì)話一般基于駐留內(nèi)存的cookie不是持續(xù)性的cookie,因而也就沒有截至日期。即使截取到JSESSION cookie,并為它設(shè)定一個(gè)失效日期發(fā)送出去。瀏覽器會(huì)話和服務(wù)器會(huì)話也會(huì)截然不同。

          七、Session的用法
          Session 對(duì)象
          可以使用 Session 對(duì)象存儲(chǔ)特定用戶會(huì)話所需的信息。這樣,當(dāng)用戶在應(yīng)用程序的 Web 頁(yè)之間跳轉(zhuǎn)時(shí),存儲(chǔ)在 Session 對(duì)象中的變量將不會(huì)丟失,而是在整個(gè)用戶會(huì)話中一直存在下去。
          當(dāng)用戶請(qǐng)求來自應(yīng)用程序的 Web 頁(yè)時(shí),如果該用戶還沒有會(huì)話,則 Web 服務(wù)器將自動(dòng)創(chuàng)建一個(gè) Session 對(duì)象。當(dāng)會(huì)話過期或被放棄后,服務(wù)器將終止該會(huì)話。
          Session 對(duì)象最常見的一個(gè)用法就是存儲(chǔ)用戶的首選項(xiàng)。例如,如果用戶指明不喜歡查看圖形,就可以將該信息存儲(chǔ)在 Session 對(duì)象中。
          注意:會(huì)話狀態(tài)僅在支持 cookie 的瀏覽器中保留。
          語(yǔ)法
          Session.collection|property|method
          集合
          Contents 包含已用腳本命令添加到會(huì)話中的項(xiàng)目。
          StaticObjects 包含通過 <OBJECT> 標(biāo)記創(chuàng)建的并給定了會(huì)話作用域的對(duì)象。
          屬性
          CodePage 將用于符號(hào)映射的代碼頁(yè)。
          LCID 現(xiàn)場(chǎng)標(biāo)識(shí)。
          SessionID 返回用戶的會(huì)話驗(yàn)證。
          Timeout 應(yīng)用程序會(huì)話狀態(tài)的超時(shí)時(shí)限,以分鐘為單位。
          方法
          Abandon 該方法破壞 Session 對(duì)象并釋放其資源。
          事件
          asa 文件中聲明下列事件的腳本。
          Session_OnEnd
          Session_OnStart
          注釋
          您可以在 Session 對(duì)象中存儲(chǔ)值。存儲(chǔ)在 Session 對(duì)象中的信息在會(huì)話及會(huì)話作用域內(nèi)有效。


          評(píng)論

          # re: WEB應(yīng)用中的SESSION知多少?  回復(fù)  更多評(píng)論   

          2016-07-25 13:18 by asd
          asd

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          主站蜘蛛池模板: 托里县| 敦煌市| 宁南县| 正蓝旗| 改则县| 金溪县| 渝北区| 托克托县| 荆州市| 华亭县| 澎湖县| 舞阳县| 景德镇市| 高清| 五原县| 若羌县| 峨山| 威远县| 子洲县| 玛多县| 鹤峰县| 枝江市| 鸡西市| 榕江县| 濮阳县| 东乌| 潍坊市| 昌吉市| 常山县| 安新县| 同德县| 大余县| 延安市| 兴安盟| 临武县| 凭祥市| 曲松县| 澳门| 三江| 应城市| 红原县|