2010-05-25 79 views
56

在我的Grails应用程序控制器之一,我在会话变量保存参数值是这样的:如何为Grails应用程序配置会话超时?

session.myVariable = params.myValue 

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

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

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

非常感谢您的回答!

回答

81

另一种办法是修改web.xml文件。在此之前,你必须调用

grails install-templates 

然后编辑的src /模板/战争/ web.xml并添加/后Servlet映射修改:

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

会话超时值使用分钟为单位。

+0

谢谢,斯蒂芬!这*完全*我在找什么。我没有意识到我必须明确地“安装模板”才能访问web.xml。我仍然是Grails中的n00b :) – curd0 2010-05-27 21:04:19

+2

我想要处理会话超时。我只是对此有疑问。在web.xml文件中配置它,一旦会话过期并执行一个控制器的动作,会发生什么?来自@ curd0例子的session.myVariable会返回null吗?谢谢! – Tomarto 2013-02-04 15:14:40

+1

不是100%确定,但我认为它是空 – 2013-02-04 16:25:46

1

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

Tutorial for changing Tomcat session length.

+0

Grails的确实使用容器的会话,但只是覆盖默认没有按”因为grails会生成一个新的servlet特定的web.xml来覆盖默认值。 – codemonkey 2015-08-28 18:44:25

5

当前grails(2.x)有一个非常奇怪的设计方法来设置会话超时。的普遍想法都不是很大的:“//会话超时”部分

  1. 注释掉的WebxmlGrails插件中添加“sessionConfig.sessionTimeout =”到Config.groovy中

  2. 的Grails安装模板,从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; 

干杯。

+0

你的意思是“将以下内容添加到你的** Build ** Config.groovy的底部”? – 2015-07-29 20:59:26

1

这里是一个更好的工作解决方案。去你的Grails主目录,找到 例如:E:\ grails-2.3。8 \ SRC \战争\ WEB-INF \ web3.0.template.xml编辑会话超时值所需值:

例子: enter code here

28

一晃几年.. 。对于Grails 3.0,在应用程序配置文件中将会话超时设置为ServerProperties

的grails-app/CONF/application.yml

server: 
    session: 
     timeout: 3600 #seconds 

默认值:秒(30分钟)

使用 getMaxInactiveInterval()验证从一个控制器为HttpSession超时:

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

Out把 - >Timeout: 3600 seconds

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

+2

其实现在是服务器:session:timeout:3600 – Kimi 2017-02-01 10:54:31

+0

谢谢@Kimi,答案已经更新。 – 2017-02-01 21:51:10

+0

如何禁用会话超时? @DemPilafian – akiong 2017-03-20 13:41:34

2

使用Grails 3.1.X会话超时已经过时了。在application.yml正确的属性是:

server: 
    session.timeout: 7200 
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 
    } 

} 
相关问题