Как настроить время ожидания сеанса для приложения Grails?
В одном из контроллеров в моем приложении Grails я сохраняю значение параметра в переменной сеанса следующим образом:
session.myVariable = params.myValue
После этого я могу получить доступ к сохраненному значению с разных контроллеров /GSP-страниц, пока активно использую приложение. Однако, если я какое-то время не использую свое приложение, хотя окно моего браузера все еще открыто, переменная сеанса теряет свое значение.
Это происходит потому, что сеанс истекает? У меня сложилось впечатление, что сеанс длится до тех пор, пока окно браузера все еще открыто, но, видимо, я ошибся.
Что я должен сделать, чтобы все переменные сеанса, которые я определяю в своем приложении Grails, не истекли до закрытия браузера? Есть ли способ установить время ожидания сеанса вручную?
Заранее благодарю за ответы!
7 ответов
Другим вариантом будет изменение web.xml. Предварительно вы должны позвонить
grails install-templates
Затем отредактируйте src/templates/war/web.xml и добавьте / измените после отображения сервлета:
<session-config>
<session-timeout>60</session-timeout>
</session-config>
Значение времени ожидания сеанса использует минуты как единицу.
Перемотка вперед на несколько лет... Для Grails 3.0 установите время ожидания сеанса с помощью ServerProperties в файле конфигурации приложения.
Grails-приложение / CONF /application.yml
server:
session:
timeout: 3600 #seconds
Значение по умолчанию: 1800 секунд (30 минут)
Проверьте время ожидания для HttpSession от контроллера, используя getMaxInactiveInterval()
:
log.println "Timeout: ${session.getMaxInactiveInterval()} seconds"
Выход -> Timeout: 3600 seconds
Обновление: отредактированная конфигурация для изменений в Grails 3.1
Текущие Grails (2.x) имеют очень странный подход к настройке времени ожидания сеанса. Ни одна из преобладающих идей не велика:
закомментируйте раздел "// Время ожидания сеанса" внутри плагина WebxmlGrails и добавьте "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
}
}