Подтвердить что ты не робот

Как установить динамический тайм-аут сеанса в веб-приложениях Java?

Мне нужно предоставить моему пользователю веб-интерфейс для изменения интервала ожидания сеанса. Таким образом, разные установки веб-приложения могут иметь разные тайм-ауты для своих сеансов, но их web.xml не может быть разным.

Есть ли способ установить таймаут сеанса программно, чтобы я мог использовать, скажем, ServletContextListener.contextInitialized(), чтобы прочитать настроенный интервал и установить его при запуске приложения?

4b9b3361

Ответ 1

Вместо использования ServletContextListener используйте HttpSessionListener.

В методе sessionCreated() вы можете установить время ожидания сеанса программно:

public class MyHttpSessionListener implements HttpSessionListener {

  public void sessionCreated(HttpSessionEvent event){
      event.getSession().setMaxInactiveInterval(15 * 60); // in seconds
  }

  public void sessionDestroyed(HttpSessionEvent event) {}

}

И не забудьте определить прослушиватель в дескрипторе развертывания:

<webapp>
...      
  <listener>                                  
    <listener-class>com.example.MyHttpSessionListener</listener-class>
  </listener>
</webapp>

(или, начиная с версии 3.0 сервлета, вместо этого можно использовать @WebListener аннотацию).


Тем не менее, я бы порекомендовал создавать разные файлы web.xml для каждого приложения и определять там время ожидания сеанса:

<webapp>
...
  <session-config>
    <session-timeout>15</session-timeout> <!-- in minutes -->
  </session-config>
</webapp>

Ответ 2

Есть ли способ установить таймаут сеанса программно

Существует три способа установить значение таймаута сеанса:

  • с помощью session-timeout в стандартном файле web.xml ~ или ~
  • в отсутствие этого элемента, получив значение по умолчанию session-timeout сервера (и, таким образом, настроив его на уровне сервера) ~ или ~
  • программно с помощью метода HttpSession. setMaxInactiveInterval(int seconds) в вашем сервлете или JSP.

Но обратите внимание, что более поздняя опция устанавливает значение тайм-аута для текущего сеанса, это не глобальная настройка.

Ответ 3

Как сказали другие участники, вы можете изменить прослушиватель сеанса. Но вы можете изменить его непосредственно в своем сервлете, например.

getRequest().getSession().setMaxInactiveInterval(123);

Ответ 4

Мне нужно предоставить моему пользователю веб-интерфейс для изменения интервала ожидания сеанса. Таким образом, разные установки веб-приложения могут иметь разные тайм-ауты для своих сеансов, но их web.xml не может быть разным.

Ваш вопрос прост: вам нужно, чтобы интервал ожидания сеанса был настраиваем во время выполнения, а конфигурирование выполнялось через веб-интерфейс, и при этом не должно быть накладных расходов на перезапуск сервера.

Я расширяю ответ майклза, чтобы ответить на ваш вопрос.

Логика: сконфигурированное значение необходимо сохранить либо в файле .properties, либо в базе данных. При запуске сервера прочитайте это сохраненное значение и скопируйте его в переменную, пока сервер не станет UP. Как конфиг обновляется и переменная обновления тоже. Вот и все.

Expaination

В классе MyHttpSessionListener 1. создать статическую переменную с именем globalSessionTimeoutInterval.

  1. создайте статический блок (выполняется только при первом обращении к классу) и прочитайте значение времени ожидания из файла config.properties и установите значение переменной globalSessionTimeoutInterval.

  2. Теперь используйте это значение, чтобы установить maxInactiveInterval

  3. Теперь веб-часть, т.е. страница конфигурации администратора

    а. Скопируйте настроенное значение в статическую переменную globalSessionTimeoutInterval.

    б. Запишите то же значение в файл config.properties. (если сервер перезапущен, то globalSessionTimeoutInterval будет загружен со значением, присутствующим в файле config.properties)

  4. Альтернативный файл .properties ИЛИ сохраняя его в базе данных. Выбор за вами.

Логический код для достижения того же

public class MyHttpSessionListener implements HttpSessionListener 
{
  public static Integer globalSessionTimeoutInterval = null;

  static
  {
      globalSessionTimeoutInterval =  Read value from .properties file or database;
  }
  public void sessionCreated(HttpSessionEvent event)
  {
      event.getSession().setMaxInactiveInterval(globalSessionTimeoutInterval);
  }

  public void sessionDestroyed(HttpSessionEvent event) {}

}

И в вашем контроллере конфигурации или сервлете конфигурации

String valueReceived = request.getParameter(timeoutValue);
if(valueReceived  != null)
{
    MyHttpSessionListener.globalSessionTimeoutInterval = Integer.parseInt(timeoutValue);
          //Store valueReceived to config.properties file or database
}