【问题标题】:How to configure a session timeout for Grails application?如何为 Grails 应用程序配置会话超时?
【发布时间】:2011-02-23 20:25:39
【问题描述】:

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

session.myVariable = params.myValue

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

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

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

提前感谢您的回答!

【问题讨论】:

    标签: session grails session-variables session-timeout


    【解决方案1】:

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

    grails install-templates
    

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

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

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

    【讨论】:

    • 谢谢,斯特凡!这正是我想要的完全。我没有意识到我必须明确地“安装模板”才能访问 web.xml。我仍然是 Grails 中的 n00b :)
    • 我也想处理会话超时。我只是有一个关于这个的问题。在 web.xml 文件中配置它,一旦会话过期并且执行来自控制器的操作会发生什么? @curd0 示例中的 session.myVariable 会返回 null 吗?谢谢!
    • Grails 2.x 还需要这个吗?我认为web.xml 在 grails 应用程序中是标准的;为什么需要install-templates
    • @raffian 我不知道是否需要,但它确实适用于 grails 2.x(在此处测试 grails 2.5.4)。 grails install-templates 输出了很多东西,但是你只需要保留 src/templates/war/web.xml,其余的 src/templates 都可以删除。
    【解决方案2】:

    快进几年...对于 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

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

    【讨论】:

    • 其实现在是server: session: timeout: 3600
    • 如何禁用会话超时? @DemPilafian
    • @akiong,我没试过,但是根据文档,A zero or negative time indicates that the session should never timeout.
    【解决方案3】:

    当前的 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;
    

    干杯。

    【讨论】:

    • 您的意思是“将以下内容添加到 BuildConfig.groovy 的底部”吗?
    • 是的,@anders.norgaard 是对的,BuildConfig 就是它起作用的地方。
    【解决方案4】:

    不推荐使用 Grails 3.1.x 会话超时。 application.yml 中正确的属性是:

    server:
        session.timeout: 7200
    

    【讨论】:

      【解决方案5】:

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

      Tutorial for changing Tomcat session length.

      【讨论】:

      • Grails 确实使用了容器的会话,但是仅仅覆盖默认值是行不通的,因为 grails 会生成一个新的特定于 servlet 的 web.xml,它将覆盖默认值。
      【解决方案6】:

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

      示例: enter code here 90

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2012-08-18
          • 1970-01-01
          • 2014-12-15
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多