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

Session 如何为Grails应用程序配置会话超时?,session,grails,session-variables,session-timeout,Session,Grails,Session Variables,Session Timeout,在Grails应用程序中的一个控制器中,我在会话变量中保留了一个参数值,如下所示: session.myVariable = params.myValue 之后,只要我积极使用应用程序,我就可以从不同的控制器/GSP页面访问保存的值。但是,如果我有一段时间不使用我的应用程序,即使我的浏览器窗口仍然打开,会话变量也会失去它的值 这种情况是否因为会话过期而发生?我的印象是,会话将一直持续到浏览器窗口仍然打开,但显然我错了 我应该如何确保我在Grails应用程序中定义的所有会话变量在浏览器关闭之前不

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

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

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

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


提前感谢您的回答

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


另一个选项是修改web.xml。你必须先打电话

grails install-templates
然后编辑src/templates/war/web.xml并在servlet映射后添加/修改:

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

60
会话超时的值以分钟为单位。

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

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

  • grails安装模板,从web.xml中删除会话超时,在WebXmlConfig.groovy中添加超时

  • 等待修复/

  • 一位同事提出了以下代码,这些代码对我来说很好用,在真正的解决方案构建到grails core中之前都可以

    只需将以下内容添加到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>")
    }
    

    干杯。

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

    例如:
    在此处输入代码
    90
    快进几年。。。对于Grails3.0,在应用程序配置文件中设置会话超时

    grails-app/conf/application.yml

    server:
       session:
          timeout: 3600  #seconds
    
    默认值:1800秒(30分钟)

    使用从控制器验证的超时
    getMaxInactiveInterval()

    输出-->
    超时:3600秒


    更新:不推荐使用Grails3.1.x会话超时对Grails3.1中的更改进行编辑配置。application.yml中的正确属性是:

    server:
        session.timeout: 7200
    

    对于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
        }
    
    }
    

    谢谢你,Stefan!这正是我想要的。我没有意识到我必须显式地“安装模板”才能访问web.xml。我仍然是Grails中的n00b:)我也想处理会话超时。我只是有个问题。在web.xml文件中配置这个,一旦会话过期并执行来自控制器的操作,会发生什么?@curd0示例中的session.myVariable会返回null吗?谢谢Grails2.x还需要这样做吗?我认为
    web.xml
    在grails应用程序中是标准的;为什么需要安装模板?@rafian我不知道是否需要,但它可以与grails2.x一起使用(这里测试grails2.5.4)。grails install templates输出了很多东西,但您只需要保留src/templates/war/web.xml,所有其余的src/templates都可以删除。您的意思是“将以下内容添加到BuildConfig.groovy的底部”吗?是的,@anders.norgaard是对的,BuildConfig是产生效果的地方。grails确实使用容器的会话,但是仅仅覆盖默认值是行不通的,因为grails将生成一个新的特定于servlet的web.xml来覆盖默认值@DemPilafian@akiong,我没有尝试过,但根据文档,
    零或负时间表示会话永远不会超时。
    server:
        session.timeout: 7200
    
    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
        }
    
    }