如何保持GAM会话活跃,避免会话过期触发登录界面?
方案1:直接调整GAM会话有效期(配置生效优先)
GAM(GeneXus Access Manager)的会话生命周期独立于IIS、ASP.NET默认会话,仅修改web.config或IIS规则不会生效,需要修改GAM专属配置:
- 进入GAM配置面板:如果是GeneXus开发的项目,在IDE的GAM Settings模块中调整参数,非IDE部署的场景直接修改根目录下的
gam.config配置文件 - 修改核心配置项:
- 把
SessionTimeout参数调整为你需要的最大时长,最大支持设置为1440分钟(24小时) - 开启
SlidingExpiration(滑动过期)开关:用户在超时周期内有任意操作就自动续期,完全匹配你需要的「长时间运行、交互时立即响应」的需求
- 把
- 配置修改后重启GAM对应的应用池即可生效,不需要修改其他IIS规则
方案2:无感知前端续期(兼顾安全与可用性)
如果不想把会话超时设置过长带来安全风险,可以用前端心跳续期的方案,完全避免用户操作时弹出登录框:
- 在全局页面脚本中添加定时心跳请求,间隔设置为GAM会话超时时间的1/2即可(比如超时设为30分钟的话,每12分钟发一次请求),示例代码如下:
// 自动续期GAM会话心跳 setInterval(async () => { // 调用GAM自带的会话刷新接口,不需要返回业务内容 await fetch('/gam/rest/refreshSession', { credentials: 'include' // 必须携带会话Cookie }) }, 12 * 60 * 1000)
- 该方案只要页面处于打开状态就会自动续期,不会影响用户正常操作,也不会额外占用太多服务器资源
之前配置不生效的常见排查点
- 检查是否开启了GAM全局强制会话超时限制:部分版本的GAM默认有全局最大会话时长兜底规则,优先级高于自定义的
SessionTimeout,需要先关闭该规则或同步调整最大值 - 检查会话存储模式:如果GAM会话存储在IIS进程内存中,IIS默认20分钟无操作就会回收应用池导致会话丢失,可以把会话存储修改为进程外模式(存储到GAM数据库或Redis),或者同步把IIS应用池的闲置超时时间调整为大于GAM会话超时时间
- 同步调整GAM会话Cookie的超时时间:
gam.config中的CookieTimeout参数需要和SessionTimeout保持一致,否则Cookie提前过期也会导致会话失效
内容的提问来源于stack exchange,提问作者Nicola
相关产品推荐
相关产品推荐

