報(bào)表session與應(yīng)用session常識普及
Posted on 2015-09-28 10:17 FineReport——報(bào)表技術(shù)領(lǐng)跑者 閱讀(96) 評論(0) 編輯 收藏1. 報(bào)表session與應(yīng)用session
報(bào)表集成到項(xiàng)目中可能會有一個(gè)疑問就是系統(tǒng)應(yīng)用和報(bào)表應(yīng)用在一個(gè)web服務(wù)器下,那系統(tǒng)session和報(bào)表session是不是一個(gè)session呢?如果不是那會不會有沖突呢?
答案是:不是同一個(gè)session也不會起沖突,因?yàn)閼?yīng)用的session存放的是request請求等一些共享信息,而報(bào)表session存放的是訪問報(bào)表的相關(guān)信息,如訪問的是不是同一個(gè)模板等,兩者是完全獨(dú)立,所以不會沖突。
2. 報(bào)表開發(fā)工具FineReport中創(chuàng)建與關(guān)閉session機(jī)制
正常情況下,當(dāng)客戶端瀏覽器訪問報(bào)表服務(wù)器端的某張報(bào)表時(shí),便會產(chǎn)生一個(gè)session會話,當(dāng)用戶關(guān)閉瀏覽器的時(shí)候就會通知報(bào)表服務(wù)器關(guān)閉這個(gè)session,但不會使保存在服務(wù)器端的session對象消失,同樣也不會使已經(jīng)保存到硬盤上的持久化cookie消失。
若用戶的機(jī)器由于某種原因如非正常關(guān)機(jī)等等導(dǎo)致瀏覽器非正常關(guān)閉時(shí),服務(wù)器沒有收到關(guān)閉這個(gè)session的信息,會一直保存這個(gè)不必要的session。為了解決這個(gè)問題,我們軟件中提供了這樣一種機(jī)制,瀏覽器每隔40秒向服務(wù)器發(fā)送一個(gè)“i am alive”信息,若報(bào)表服務(wù)器一分鐘沒有收到這個(gè)信息便會自動(dòng)關(guān)閉這個(gè)session。當(dāng)瀏覽器遇到非正常停止時(shí),便不會發(fā)送“i am alive”信息,相應(yīng)的session不會在一分鐘以內(nèi)被關(guān)閉。
3. session基本概念
session機(jī)制本身并不復(fù)雜,然而其實(shí)現(xiàn)和配置上的靈活性卻使得具體情況復(fù)雜多變。這也要求我們不能把僅僅某一次的經(jīng)驗(yàn)或者某一個(gè)瀏覽器,服務(wù)器的經(jīng)驗(yàn)當(dāng)作普遍適用的經(jīng)驗(yàn),而是始終需要具體情況具體分析。
通俗的說:客戶端瀏覽器訪問某個(gè)地址,發(fā)送了一個(gè)請求,就產(chǎn)生一個(gè)session會話,現(xiàn)在的瀏覽器都可以打開多個(gè)tab窗口,打開的都屬于一個(gè)session,當(dāng)該瀏覽器關(guān)閉的時(shí)候session就關(guān)閉了。若不關(guān)閉該瀏覽器,再次打開一個(gè)瀏覽器,會重新創(chuàng)建一個(gè)session。
3.1 session在何時(shí)被創(chuàng)建
一個(gè)常見的誤解是以為session在有客戶端訪問時(shí)就被創(chuàng)建,然而事實(shí)是直到某server端程序調(diào)用HttpServletRequest.getSession(true)這樣的語句時(shí)才被創(chuàng)建,注意如果JSP沒有顯示的使用<%@page session="false"%>關(guān)閉session,則JSP文件在編譯成Servlet時(shí)將會自動(dòng)加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true),這也是JSP中隱含的session對象的來歷。
由于session會消耗內(nèi)存資源,因此,如果不打算使用session,應(yīng)該在所有的JSP中關(guān)閉它。
3.2 session何時(shí)被刪除
綜合前面的討論,session在下列情況下被刪除:
a、程序調(diào)用HttpSession.invalidate() b、距離上一次收到客戶端發(fā)送的session id時(shí)間間隔超過了session的最大有效時(shí)間 c、服務(wù)器進(jìn)程被停止
3.3 如何做到在瀏覽器關(guān)閉時(shí)刪除session
嚴(yán)格的講,做不到這一點(diǎn)。可以做一點(diǎn)努力的辦法是在所有的客戶端頁面里使用javascript代碼window.oncolose來監(jiān)視瀏覽器的關(guān)閉動(dòng)作,然后向服務(wù)器發(fā)送一個(gè)請求來刪除session。但是對于瀏覽器崩潰或者強(qiáng)行殺死進(jìn)程這些非常規(guī)手段仍然無能為力。