Как настроить время ожидания сеанса для приложения Grails? - PullRequest
57 голосов
/ 25 мая 2010

В одном из контроллеров моего приложения Grails я сохраняю значение параметра в переменной сеанса, например:

session.myVariable = params.myValue

После этого я могу получить доступ к сохраненному значению с разных контроллеров / GSP-страниц, пока я активно использую приложение. Однако, если я какое-то время не использую свое приложение, хотя окно браузера все еще открыто, переменная сеанса теряет свое значение.

Это происходит из-за истечения сеанса? У меня сложилось впечатление, что сеанс длится до тех пор, пока окно браузера все еще не открыто, но, видимо, я ошибся.

Что я должен сделать, чтобы все переменные сеанса, которые я определяю в своем приложении Grails, не истекли до закрытия браузера? Есть ли способ установить время ожидания сеанса вручную?

Заранее благодарю за ответы!

Ответы [ 7 ]

82 голосов
/ 26 мая 2010

Другим вариантом будет изменение файла web.xml. Предварительно вы должны позвонить

grails install-templates

Затем отредактируйте src / templates / war / web.xml и добавьте / измените после отображения сервлета:

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

В качестве значения тайм-аута сеанса в качестве единицы используются минуты.

33 голосов
/ 16 июня 2015

Перемотка вперед на несколько лет ... Для 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

6 голосов
/ 28 августа 2013

Текущие Grails (2.x) имеют очень странный подход к настройке времени ожидания сеанса. Ни одна из преобладающих идей не велика:

  1. закомментируйте раздел "// Время ожидания сеанса" в плагине WebxmlGrails и добавьте "sessionConfig.sessionTimeout =" в Config.groovy

  2. grails install-templates, удалить тайм-аут сеанса из 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;

Приветствие.

2 голосов
/ 28 июля 2016

С Grails 3.1.x тайм-аут сеанса устарел. Правильное свойство в application.yml :

server:
    session.timeout: 7200
1 голос
/ 13 июля 2014

вот лучшее рабочее решение. иди домой свой каталог Grails и найти Пример: E: \ grails-2.3.8 \ src \ war \ WEB-INF \ web3.0.template.xml отредактируйте значение времени ожидания сеанса до желаемых значений:

Пример: enter code here 90

1 голос
/ 25 мая 2010

Я могу ошибаться, но я почти уверен, что Grails использует сеансы, связанные с вашим контейнером приложений. Например, если вы используете Tomcat, вы можете указать продолжительность сеанса.

Учебник по изменению продолжительности сеанса Tomcat.

0 голосов
/ 02 ноября 2016

Для приложения 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
    }

}
...