如何为Grails应用程序配置会话超时?

cur*_*rd0 58 session grails session-variables session-timeout

在我的Grails应用程序中的一个控制器中,我在会话变量中保留一个参数值,如下所示:

session.myVariable = params.myValue
Run Code Online (Sandbox Code Playgroud)

之后,只要我主动使用该应用程序,我就可以从不同的控制器/ GSP页面访问保存的值.但是,如果我暂时不使用我的应用程序,即使我的浏览器窗口仍处于打开状态,会话变量也会失去它的值.

会发生这种情况是因为会话到期了吗?我的印象是会话一直存在,直到浏览器窗口仍然打开,但显然我错了.

我该怎么做才能确保我在Grails应用程序中定义的所有会话变量在浏览器关闭之前不会过期?有没有办法手动设置会话超时?

提前感谢您的回答!

Ste*_*ter 84

另一种选择是修改web.xml.之前你必须打电话

grails install-templates
Run Code Online (Sandbox Code Playgroud)

然后编辑src/templates/war/web.xml并在servlet-mapping之后添加/修改:

<session-config>
   <session-timeout>60</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)

session-timeout的值使用分钟作为单位.

  • 我也想处理会话超时.我对此有一个疑问.在web.xml文件中配置它,一旦会话到期并执行来自控制器的操作会发生什么?来自@ curd0的例子的session.myVariable会返回null吗?谢谢! (2认同)

Dem*_*ian 35

快进几年......对于Grails 3.0 ,在应用程序配置文件中使用ServerProperties设置会话超时.

的grails-app/CONF/application.yml

server:
   session:
      timeout: 3600  #seconds
Run Code Online (Sandbox Code Playgroud)

默认值:1800秒(30分钟)

使用以下命令验证来自控制器 的HttpSession超时getMaxInactiveInterval():

log.println "Timeout: ${session.getMaxInactiveInterval()} seconds"
Run Code Online (Sandbox Code Playgroud)

输出 - > Timeout: 3600 seconds

更新:为Grails 3.1中的更改​​编辑了配置

  • 实际上它现在是服务器:session:timeout:3600 (2认同)
  • @akiong,我还没有尝试过,但根据文档,"零或负时间表示会话永远不会超时". (2认同)
  • 对于 Grails 5,它是 `server.servlet.session.timeout=8h`。它随着底层 spring-boot 版本中的属性更改而更改。请参阅/sf/ask/2868246881/ (2认同)

小智 7

当前的grails(2.x)有一个非常奇怪的设计方法来设置会话超时.流行的想法都不是很好:

  1. 在WebxmlGrails插件中注释掉"// session Timeout"部分,并将"sessionConfig.sessionTimeout ="添加到Config.groovy

  2. grails install-templates,从web.xml中删除session-timeout,在WebXmlConfig.groovy中添加超时

  3. 等待解决.:/

一位同事提出了以下适用于我的代码,直到将一个真正的解决方案构建到grails核心中.

只需将以下内容添加到config.groovy文件的底部,然后设置适当的超时.

grails.war.resources = { stagingDir, args ->
  def webXML = new java.io.File("${stagingDir}/WEB-INF/web.xml")
  webXML.text = webXML.text.replaceFirst("<session-timeout>30</session-timeout>", "<session-timeout>90</session-timeout>")
}
Run Code Online (Sandbox Code Playgroud)

我建议正确的解决方案是在Config.groovy文件中允许一行:

session.timeout = 90;
Run Code Online (Sandbox Code Playgroud)

干杯.