60

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

session.myVariable = params.myValue

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

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

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

预先感谢您的回答!

4

7 回答 7

85

另一种选择是修改 web.xml。事先你必须打电话

grails install-templates

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

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

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

于 2010-05-25T20:12:48.133 回答
42

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

grails-app/conf/application.yml

server:
   session:
      timeout: 3600  #seconds

默认值:1800秒(30 分钟)

使用以下方法从控制器 验证HttpSessiongetMaxInactiveInterval()的超时:

log.println "Timeout: ${session.getMaxInactiveInterval()} seconds"

输出 --> Timeout: 3600 seconds

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

于 2015-06-16T07:51:16.413 回答
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>")
}

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

session.timeout = 90;

干杯。

于 2013-08-28T17:03:55.627 回答
2

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

server:
    session.timeout: 7200
于 2016-07-28T13:39:43.510 回答
1

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

更改 Tomcat 会话长度的教程。

于 2010-05-25T18:49:23.883 回答
1

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

示例: enter code here 90

于 2014-07-13T06:49:07.647 回答
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
    }

}
于 2016-11-02T14:25:25.867 回答