Tomcat的Session持久化策略是什么,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
潁上網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
關(guān)于Tomcat的Session,我們都知道默認(rèn)是保存在內(nèi)存中。為了解決重啟應(yīng)用服務(wù)器Session丟失的問(wèn)題,Tomcat內(nèi)部的StandardManager會(huì)在正常的關(guān)閉時(shí)鈍化活動(dòng)的Session 并在重啟的時(shí)候重新加載。
而Tomcat在StandardManager之外,還提供了對(duì)應(yīng)持久化Session的Manager實(shí)現(xiàn): PersistentManager,目前對(duì)應(yīng)的有兩種持久化的實(shí)現(xiàn)
FileStore
JDBCStore
分別是將活動(dòng)的Session保存在磁盤上和保存到數(shù)據(jù)庫(kù)中。
本次我們以FileStore為例,來(lái)分析下PersistentManager在Tomcat中的實(shí)現(xiàn)。
PersistentManager的配置基本上是這樣的:
對(duì)于FileStore和JDBCStore,基本配置都類似,有差異的只是Store中對(duì)應(yīng)的具體屬性,比如JDBCStore需要額外指定數(shù)據(jù)的用戶名和密碼等。上面的配置可以直接 用于FileStore。
其中,像maxIdleBackup
、maxIdleSwap
、minIdleSwap
默認(rèn)都是關(guān)閉的,默認(rèn)值都是-1。當(dāng)然,我們上面的配置是修改過(guò)的。默認(rèn)的行為會(huì)和StandardManager一致,即在關(guān)閉重啟時(shí)進(jìn)行Session的鈍化和解析。
而當(dāng)按照我們上面的配置啟動(dòng)Tomcat后,服務(wù)器會(huì)根據(jù)maxIdleBackup的時(shí)間,以秒為單位,進(jìn)行空閑Session的持久化。在配置的目錄中,會(huì)生成以sessionId為文件名.session的文件
例如:5E62468BFF33CF7DE28464A76416B85E.session
主要參數(shù)說(shuō)明:
saveOnRestart -當(dāng)服務(wù)器關(guān)閉時(shí),是否要將所有的session持久化;
maxActiveSessions - 可處于活動(dòng)狀態(tài)的session數(shù);
minIdleSwap/maxIdleSwap -session處于不活動(dòng)狀態(tài)最短/長(zhǎng)時(shí)間(s),sesson對(duì)象轉(zhuǎn)移到File Store中;
maxIdleBackup -大于這一時(shí)間時(shí),會(huì)將session備份。
寫文件:
public void save(Session session) throws IOException { // Open an output stream to the specified pathname, if any File file = file(session.getIdInternal()); if (file == null) { return; } if (manager.getContext().getLogger().isDebugEnabled()) { manager.getContext().getLogger().debug(sm.getString(getStoreName() + ".saving", session.getIdInternal(), file.getAbsolutePath())); } try (FileOutputStream fos = new FileOutputStream(file.getAbsolutePath()); ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(fos))) { ((StandardSession)session).writeObjectData(oos); } }
我們來(lái)看load操作,和StandardManager加載Session基本一致,先創(chuàng)建空的session,再readObjectData:
public Session load(String id) { File file = file(id); Context context = getManager().getContext(); try (FileInputStream fis = new FileInputStream(file.getAbsolutePath()); ObjectInputStream ois = getObjectInputStream(fis)) { StandardSession session = (StandardSession) manager.createEmptySession(); session.readObjectData(ois); session.setManager(manager); return session; } catch (FileNotFoundException e) { return null; } }
刪除操作:
public void remove(String id) throws IOException { File file = file(id); file.delete();}
而這些load,remove等操作的觸發(fā)點(diǎn),就是我們之前提到過(guò)的后臺(tái)線程:我們?cè)谇懊娣治鲞^(guò)期的session是如何處理的時(shí)候,曾提到過(guò),可以移步這里:對(duì)于過(guò)期的session,Tomcat做了什么?
都是使用backgroundProcess
public void backgroundProcess() { count = (count + 1) % processExpiresFrequency; if (count == 0) processExpires();}
在PersistentManager
的processExpires方法中,重點(diǎn)有以下幾行
processPersistenceChecks(); if (getStore() instanceof StoreBase) { ((StoreBase) getStore()).processExpires(); }
其中在processPersistenceChecks
中,就會(huì)對(duì)我們上面配置的幾項(xiàng)進(jìn)行檢查,判斷是否要進(jìn)行session文件的持久化等操作
/** * Called by the background thread after active sessions have been checked * for expiration, to allow sessions to be swapped out, backed up, etc. */public void processPersistenceChecks() { processMaxIdleSwaps(); processMaxActiveSwaps(); processMaxIdleBackups(); }
此外,通過(guò)配置pathname
為空,即可禁用session的持久化策略,在代碼中,判斷pathname為空時(shí),不再創(chuàng)建持久化文件,從而禁用此功能。
總結(jié)下,正如文檔中所描述,StandardManager所支持的重啟時(shí)加載已持久化的Session這一特性,相比PersistentManager只能算簡(jiǎn)單實(shí)現(xiàn)。要實(shí)現(xiàn)更健壯、更符合生產(chǎn)環(huán)境的重啟持久化,最好使用PersistentManager并進(jìn)行恰當(dāng)?shù)呐渲谩?/p>
看完上述內(nèi)容,你們掌握Tomcat的Session持久化策略是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!