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

问题描述 投票:0回答:7

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

session.myVariable = params.myValue

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

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

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

提前感谢您的回答!

session grails session-variables session-timeout
7个回答
86
投票

另一个选择是修改 web.xml。之前一定要打电话

grails install-templates

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

<session-config>
   <session-timeout>60</session-timeout>
</session-config>

session-timeout的值以分钟为单位。


46
投票

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

grails-app/conf/application.yml

server:
   session:
      timeout: 3600  #seconds

默认值:1800秒(30分钟)

验证超时 HttpSession 使用

getMaxInactiveInterval()
:

从控制器
log.println "Timeout: ${session.getMaxInactiveInterval()} seconds"

输出 -->

Timeout: 3600 seconds

更新 1: 编辑了 Grails 3.1 配置的更改。

更新 2: 对于 Grails 5,请参阅下面 Marc Schmid 的评论。


7
投票

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

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

  2. grails install-templates,从 web.xml 中删除会话超时,在 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>")
}

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

session.timeout = 90;

干杯。


3
投票

在 Grails 3.1.x 中,会话超时已被弃用。 application.yml中正确的属性是:

server:
    session.timeout: 7200

1
投票

我可能是错的,但我很确定 Grails 使用与您的应用程序容器关联的会话。例如,如果您使用 Tomcat,您可以指定会话的长度。

更改 Tomcat 会话长度的教程。


1
投票

这是一个更好的工作解决方案。进入你的 grails 主目录并找到 示例:E:\grails-2.3.8\src\war\WEB-INF\web3.0.template.xml 将会话超时值编辑为所需值:

示例:

enter code here
90


0
投票

对于 Grails 3 应用程序,修改

Application.groovy
对我有用:

package foo

import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
import org.apache.catalina.Context
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory
import org.springframework.boot.context.embedded.tomcat.TomcatContextCustomizer
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
import org.springframework.context.annotation.Bean

class Application extends GrailsAutoConfiguration {

    static void main(String[] args) {
        GrailsApp.run(Application, args)
    }

    @Bean
    EmbeddedServletContainerFactory containerFactory() {
        TomcatEmbeddedServletContainerFactory containerFactory = new TomcatEmbeddedServletContainerFactory()

        containerFactory.addContextCustomizers(new TomcatContextCustomizer() {
            @Override
            void customize(Context context) {
                int oneWeekInMinute = 7 * 24 * 60
                context.setSessionTimeout(oneWeekInMinute)
            }
        });

        return containerFactory
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.