Tomcat的会话持久性策略是什么?我相信很多没有经验的人都不知所措。因此,本文总结了问题产生的原因及解决方法。希望你能通过这篇文章解决这个问题。
至于Tomcat的Session,我们都知道它默认存储在内存中。为了解决重启应用服务器时缺少Session的问题,Tomcat中的StandardManager会在正常关机时钝化活动Session,重启时重新加载。
雄猫,除了StandardManager,还提供:持久会话对应的经理PersistentManager。目前有两种对应的持久化实现。
文件存储
JDBCStore
将活动会话分别保存在磁盘和数据库上。
这一次,我们以文件存储为例来分析PersistentManager在Tomcat中的实现。
配置
PersistentManager的配置基本如下:
managerassname=' org . Apache . catalina . session . persistentmanager ' debug=' 0 ' saveornestart=' true ' maxactivesessions='-1 ' minIdleSwap='-1 ' maxIdleSwap=' 5 ' maxId Lebackup=' 3 ' Store类名=' org . Apache . catalina . session . FileStore ' directory='/home/my testsession//manager对于filestore和JDBCStore,基本配置相似,只是Store的特定属性不同,例如JD上述配置可以直接用于文件存储。
其中,maxIdleBackup、maxIdleSwap、minIdleSwap默认都是关闭的,默认值为-1。当然,我们上面的配置已经修改了。的默认行为将与标准管理器一致,即在关闭和重新启动时将执行会话的钝化和解析。
当按照我们上面的配置启动Tomcat时,服务器将根据maxIdleBackup的时间以秒为单位持续空闲会话。在配置的目录中,将生成一个以sessionId作为文件名的文件。
示例:5e 62468 BF 33 cf 7 de 28464 a 76416 b 85e . session
主要参数描述:
savenrestart-服务器关闭时是否保留所有会话;
max session-可以活动的会话数;
minidleswap/maxileswap会话处于非活动状态的时间最短/最长,会话对象被传输到文件存储;
maxidlebackup-会话将在大于此时间时进行备份。
写入文件:
public void save(SessionSession)throwSioException {//OpenanoutputStreamthospectidpathname,ifanyFilefile=file(session . Getidinternal());if(file==null){nbsp
; 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); } }
我们来看load操作,和StandardManager加载Session基本一致,先创建空的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等操作的触发点,就是我们之前提到过的后台线程:我们在前面分析过期的session是如何处理的时候,曾提到过,可以移步这里:对于过期的session,Tomcat做了什么?
都是使用backgroundProcess
public void backgroundProcess() { count = (count + 1) % processExpiresFrequency; if (count == 0) processExpires();}
在PersistentManager
的processExpires方法中,重点有以下几行
processPersistenceChecks(); if (getStore() instanceof StoreBase) { ((StoreBase) getStore()).processExpires(); }
其中在processPersistenceChecks
中,就会对我们上面配置的几项进行检查,判断是否要进行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(); }
此外,通过配置pathname
为空,即可禁用session的持久化策略,在代码中,判断pathname为空时,不再创建持久化文件,从而禁用此功能。
<Manager pathname="" />
总结下,正如文档中所描述,StandardManager所支持的重启时加载已持久化的Session这一特性,相比PersistentManager只能算简单实现。要实现更健壮、更符合生产环境的重启持久化,最好使用PersistentManager并进行恰当的配置。
看完上述内容,你们掌握Tomcat的Session持久化策略是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/138397.html