You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Moqui执行Transition/服务调用时覆盖会话超时设置

在Moqui执行Transition或服务调用时动态修改会话超时值

问题背景

默认情况下Moqui的会话超时可通过web.xml的<session-timeout>配置(单位分钟),或在Moqui配置XML中通过webapp.session-config.@timeout覆盖(单位秒),相关配置如下:

<session-config>
    <!-- session timeout in minutes; note that this may be overridden with webapp.session-config.@timeout in the Moqui Conf XML file -->
    <session-timeout>600</session-timeout>
    <cookie-config><http-only>true</http-only><comment>__SAME_SITE_LAX__</comment></cookie-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

Moqui会通过MoquiSessionListener的sessionCreated方法初始化会话超时:

@Override void sessionCreated(HttpSessionEvent event) {
    HttpSession session = event.session
    ExecutionContextFactoryImpl ecfi = (ExecutionContextFactoryImpl) Moqui.getExecutionContextFactory()
    String moquiWebappName = session.servletContext.getInitParameter("moqui-name")
    ExecutionContextFactoryImpl.WebappInfo wi = ecfi?.getWebappInfo(moquiWebappName)
    if (wi?.sessionTimeoutSeconds != null) session.setMaxInactiveInterval(wi.sessionTimeoutSeconds)
}

该监听器已在MoquiDefaultConf.xml中注册:

<!-- Moqui Session Listener (necessary to handle expired sessions, etc) -->
<listener class="org.moqui.impl.webapp.MoquiSessionListener"/>

需求是:在执行Transition或服务调用时,动态修改当前会话的超时值。

可行方案

1. 在Transition/服务中直接修改会话超时

Moqui的ExecutionContext提供了访问当前Web请求会话的入口,可直接调用Servlet标准API修改超时时间(单位为秒),修改后立即生效。

在Transition的Groovy脚本中实现

// 获取当前执行上下文
ExecutionContext ec = context.getExecutionContext()
// 设置会话超时为30分钟(1800秒),替换成你需要的数值
ec.webFacade.request.session.setMaxInactiveInterval(1800)

在Java服务中实现

import org.moqui.context.ExecutionContext;
import javax.servlet.http.HttpSession;

ExecutionContext ec = Moqui.getExecutionContext();
HttpSession session = ec.getWebFacade().getRequest().getSession();
// 设置超时为1小时(3600秒)
session.setMaxInactiveInterval(3600);

2. 自定义会话监听器(全局动态调整场景)

如果需要根据业务规则(比如用户角色、操作类型)全局动态调整会话超时,可以自定义一个Servlet会话监听器,在sessionCreated或sessionAttributeChanged事件中修改超时值,同时保留原MoquiSessionListener的逻辑。

但这种方式适合全局生效的场景,若只是针对特定Transition/服务,第一种方法更直接高效。

原理说明

Servlet标准的HttpSession.setMaxInactiveInterval(int seconds)方法允许在会话生命周期内随时修改超时时间,该值会覆盖初始化时的配置,Moqui框架完全兼容这个标准API,无需额外扩展核心逻辑。

内容的提问来源于stack exchange,提问作者M.A.M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:31:16