Session 如何为Grails应用程序配置会话超时?
在Grails应用程序中的一个控制器中,我在会话变量中保留了一个参数值,如下所示:Session 如何为Grails应用程序配置会话超时?,session,grails,session-variables,session-timeout,Session,Grails,Session Variables,Session Timeout,在Grails应用程序中的一个控制器中,我在会话变量中保留了一个参数值,如下所示: session.myVariable = params.myValue 之后,只要我积极使用应用程序,我就可以从不同的控制器/GSP页面访问保存的值。但是,如果我有一段时间不使用我的应用程序,即使我的浏览器窗口仍然打开,会话变量也会失去它的值 这种情况是否因为会话过期而发生?我的印象是,会话将一直持续到浏览器窗口仍然打开,但显然我错了 我应该如何确保我在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)有一种非常奇怪的设计方法来设置会话超时。没有一个流行的想法是伟大的:
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
}
}