Программно изменить время ожидания сеанса

Я могу выйти из системы после определенного времени бездействия.

<session-timeout>240</session-timeout> 

Но есть ли способ выйти из системы в указанное время или лучше, например, до 5 минут бездействия после указанного времени?


person gaffcz    schedule 28.05.2011    source источник
comment
Я не понимаю, почему вы просто не отредактируете <session-timeout> с 240 минут до 5 минут.   -  person BalusC    schedule 30.05.2011
comment
Потому что пользователи используют его на волнах. Иногда он используется постоянно, иногда только время от времени. Во втором случае выход из системы через 5 минут бездействия приводит к регулярным выходам из системы и неудобен для пользователя.   -  person gaffcz    schedule 30.05.2011
comment
я сделал новый ответ (о странном поведении слушателя)   -  person gaffcz    schedule 30.05.2011
comment
Итак, вы хотите иметь возможность изменять время ожидания сеанса для определенных запросов? Если да, то какие и когда? Для каких запросов требуется тайм-аут 240 минут, а для каких — 5 минут? Когда бы вы хотели изменить его?   -  person BalusC    schedule 30.05.2011
comment
Рабочее время делится на смены, во время смены оно должно составлять, например, 30 минут (240, конечно, слишком много) и 5 ​​минут после фактического окончания смены (например, в 14:05).   -  person gaffcz    schedule 30.05.2011


Ответы (3)


Время ожидания сеанса можно изменить с помощью HttpSession#setMaxInactiveInterval() где вы можете указать желаемое время ожидания в секундах.

Если вы хотите охватить широкий спектр запросов для этого, например. все страницы в папке /admin или что-то в этом роде, то лучше всего это сделать, создав Filter, который сопоставляется с FacesServlet и выполняет примерно следующую работу:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpSession session = request.getSession();

    if (request.getRequestURI().startsWith("/admin/")) {
        session.setMaxInactiveInterval(60 * 5); // 5 minutes.
    } else {
        session.setMaxInactiveInterval(60 * 240); // 240 minutes.
    }

    chain.doFilter(req, res);
}

В управляемом компоненте JSF сеанс доступен по ExternalContext#getSession():

HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession();
// ...

Или, если вы уже используете JSF 2.1, вы также можете использовать новый ExternalContext#setSessionMaxInactiveInterval(), который делегирует именно этот метод.

person BalusC    schedule 30.05.2011
comment
Спасибо, я постараюсь понять это позже (после других сессионных вещей) :) - person gaffcz; 30.05.2011
comment
Я вернулся к этой статье и должен еще раз поблагодарить вас (см. мой обновленный пост, если хотите) :-) - person gaffcz; 25.07.2011
comment
Пожалуйста. Если приведенный выше ответ был наиболее полезным и, наконец, был вашим принятым решением, почему тогда он не помечен как принятый? - person BalusC; 25.07.2011

Автоматически - нет.

Вам нужно будет:

  • хранить все сеансы в файле Set. Сделайте это в HttpSessionListener, когда они будут созданы.
  • в данное время (например, используя кварц) .invalidate() их
person Bozho    schedule 28.05.2011
comment
Я пробовал, но есть проблема (я отредактировал свой пост). Не могли бы вы помочь мне снова? - person gaffcz; 30.05.2011
comment
выглядит странно. Вам нужно будет поставить точку останова и посмотреть, что и когда произойдет. - person Bozho; 30.05.2011
comment
Я бы удалил аргумент (true) для getSession. Кроме этого - да. - person Bozho; 30.05.2011
comment
нет, это не так. Существует перегруженный метод, который ничего не требует. - person Bozho; 30.05.2011
comment
Я сделал новый ответ только для проблемы со слушателем - person gaffcz; 30.05.2011

То, что Божо дал вам, верно, то, что вы видите, скорее всего, это то, что когда вы нажимаете кнопку выхода из системы, сеанс уничтожается, но затем контейнер сервлета направляется на страницу «после выхода из системы», что автоматически вызывает сеанс быть созданным (отсюда «Сеанс уничтожен», за которым следует «Сеанс создан»).

Если не считать создания собственной системы обработки сеансов, я не знаю, как вы это обойдете. (У меня была эта проблема в прошлом, и она исчезла после того, как мы создали нашу собственную систему сеансов)

person Crollster    schedule 30.05.2011
comment
Спасибо, Crollster, но это точно так же, даже если я отключу перенаправление.... - person gaffcz; 30.05.2011