2009-12-22 2 views
2

Я новичок в JSP. Я использовал следующий код в класс, который реализует HttpSessionListener получить SESSION OUT, когда сеанс времени ожидания:Как позвонить sessionDestroyed, когда время сеанса

public void sessionCreated(HttpSessionEvent arg0) { 
     System.out.print("SESSION Created"); 
    } 

    public void sessionDestroyed(HttpSessionEvent arg0) { 
     System.out.print("SESSION OUT"); 
    } 

и я поставил в web.xml:

<session-config> 
    <session-timeout>1</session-timeout> 
    </session-config> 

сервлет ждет более двух минут, затем он вызывает sessionDestroyed.

Есть ли способ заставить sessionDestroyed когда тайм-аут?

Заранее спасибо.

ответ

2

Что заставляет вас думать, что sessionDestroyed is не вызывается, когда сеанс заканчивается? Или, другими словами, какая вы интерпретация того факта, что его вообще называют?

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

В любом случае, кажется почти уверенным, что сервлет делает то, что вы хотите - видя, что сеанс тайм-аута и вызов соответствующего метода - вопрос только в том, будете ли вы видеть это ровно через 60 секунд после последний запрос или бит позже. Я бы предположил, что в целом вы не должны полагаться на точные тайминги, когда этот метод вызывается; используйте его, чтобы очистить ресурсы, конечно, но не для чего-то вроде правильности программы (вы получите IllegalStateExceptions, если вы вызовете методы на недействительном сеансе). Если вы чувствуете, что действительно должны полагаться на это, возможно, объясните, что вы делаете, чтобы другие могли предложить более подходящие способы достижения этого.

1

Я не думаю, что спецификация J2EE дает какие-либо гарантии относительно того, когда будут вызваны методы прослушивателя. Просто говорится, что в какой-то момент они будут вызваны.

Я видел код, который работал на одном контейнере (Tomcat), но не работал на другом контейнере (OC4J). Разработчики сделали недопустимое предположение о том, когда будет вызван метод sessionDestroyed.

UPDATE

Обратите внимание, что поведение этого интерфейса изменилось в v2.4 сервлета спецификации. См. page 21.

1

Когда вы вынуждаете пользователя выйти из системы с помощью метода invalidate(), который вызывается методом HttpSessionListener sessionDestroyed() дважды, один раз при выходе из системы и второй раз после некоторого задержанного периода времени. Это происходит, если после выхода из системы вы перенаправляете пользователя обратно на веб-страницу в своем приложении. То, что вы по существу делаете, - это запуск другого сеанса (что может быть не сразу очевидным, если вы не добавили требования безопасности/аутентификации ко всем вашим веб-страницам), а второй второй вызов метода sessionDestroyed() - это тайм-аут. Простое решение, при выходе из системы перенаправляет пользователя на веб-страницу вне вашего приложения.Прочтите эту статью session

1

Сервлет ждет более двух минут, после чего он вызывает sessionDestroyed.

Есть ли способ заставить sessionDestroyed при тайм-ауте?

Это специфичная для реализации (зависит от сервера приложений). Существует фоновый поток, который проверяет сеансы с временными интервалами и пожинает все истекшие. Это может произойти каждую минуту, но может также выполняться каждые 15 минут. Они также будут собраны немедленно, если вы запускаете запрос, в то время как связанная сессия уже была отключена, но еще не получена.

Таким образом, если вы, например, подождаете одну минуту и ​​пожарите новый запрос, тогда он будет немедленно получен. В этом нет необходимости беспокоиться об этом. Вам не нужно заставлять его немедленно пожинать их, что было бы дорогостоящей задачей. Знаете, это все о программировании, а не о какой-то магии;)

+0

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