Как установить динамический тайм-аут сеанса в веб-приложениях Java?
Мне нужно предоставить моему пользователю веб-интерфейс для изменения интервала ожидания сеанса. Таким образом, разные установки веб-приложения могут иметь разные тайм-ауты для своих сеансов, но их web.xml
не может быть разным.
Есть ли способ установить таймаут сеанса программно, чтобы я мог использовать, скажем, ServletContextListener.contextInitialized()
, чтобы прочитать настроенный интервал и установить его при запуске приложения?
Ответы
Ответ 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.
создайте статический блок (выполняется только при первом обращении к классу) и прочитайте значение времени ожидания из файла config.properties и установите значение переменной globalSessionTimeoutInterval.
Теперь используйте это значение, чтобы установить maxInactiveInterval
Теперь веб-часть, т.е. страница конфигурации администратора
а. Скопируйте настроенное значение в статическую переменную globalSessionTimeoutInterval.
б. Запишите то же значение в файл config.properties.
(если сервер перезапущен, то globalSessionTimeoutInterval будет загружен со значением, присутствующим в файле config.properties)
Альтернативный файл .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
}