在我的 Grails 应用程序的控制器之一中,我在会话变量中保留一个参数值,如下所示:
session.myVariable = params.myValue
之后,只要我主动使用该应用程序,我就可以从不同的控制器/GSP 页面访问保存的值。但是,如果我有一段时间不使用我的应用程序,即使我的浏览器窗口仍然打开,会话变量也会失去它的值。
出现这种情况是因为会话过期吗?我的印象是会话一直存在,直到浏览器窗口仍然打开,但显然我错了。
我应该如何确保我在 Grails 应用程序中定义的所有会话变量在浏览器关闭之前不会过期?有没有办法手动设置会话超时?
提前感谢您的回答!
另一个选择是修改 web.xml。之前一定要打电话
grails install-templates
然后编辑 src/templates/war/web.xml 并在 servlet-mapping 之后添加/修改:
<session-config>
<session-timeout>60</session-timeout>
</session-config>
session-timeout的值以分钟为单位。
快进几年...对于 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 的评论。
当前的 grails (2.x) 有一个非常奇怪的设计方法来设置会话超时。流行的想法都不是很好:
注释掉 WebxmlGrails 插件中的“//session Timeout”部分,并将“sessionConfig.sessionTimeout=”添加到 Config.groovy
grails install-templates,从 web.xml 中删除会话超时,在 WebXmlConfig.groovy 中添加超时
等待修复。 :/
一位同事提出了以下代码,该代码对我来说效果很好,并且在将真正的解决方案内置到 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;
干杯。
在 Grails 3.1.x 中,会话超时已被弃用。 application.yml中正确的属性是:
server:
session.timeout: 7200
我可能是错的,但我很确定 Grails 使用与您的应用程序容器关联的会话。例如,如果您使用 Tomcat,您可以指定会话的长度。
这是一个更好的工作解决方案。进入你的 grails 主目录并找到 示例:E:\grails-2.3.8\src\war\WEB-INF\web3.0.template.xml 将会话超时值编辑为所需值:
示例:
enter code here
90
对于 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
}
}