如何在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
相关产品推荐
相关产品推荐

