Автоматическое продление сессии ICEFaces - PullRequest
1 голос
/ 10 апреля 2009

У меня есть приложение, в котором пользователи часто оставляют страницу работающей в своем браузере весь день. На странице есть интервал рендеринга, который обновляет данные каждые 30 секунд.

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

Есть ли способ автоматически расширять сеанс каждый раз, когда для одной из этих страниц запускается запланированный рендер?

Ответы [ 4 ]

2 голосов
/ 20 апреля 2009

Я действительно не хочу делать хаки Javascript для нажатия кнопок, когда мой код уже вызывается через каждые 30 секунд ICEFaces. Кажется, работает следующий взломанный обходной путь для внутреннего таймера ICEFaces:

  private void updateSessionExpiration () {
      HttpSession sess = getSession();
      if (sess != null) {
        try {
            Field fld = SessionDispatcher.class.getDeclaredField("SessionMonitors");
            fld.setAccessible(true);
            Map map = (Map)fld.get(null);
            String sessID = sess.getId();
            if (map.containsKey(sessID)) {
                log.info("About to touch session...");
                SessionDispatcher.Monitor mon = 
                     (SessionDispatcher.Monitor)map.get(sessID);
                mon.touchSession();
            }
        } catch (Exception e) {
            log.error("Failed to touch session");
        }
      }
  }

Кроме того, с ICEFaces 1.8.2RC1 (и, вероятно, в конечном счете, с выходной версией ICEFaces 1.8.2), доступны два новых обходных пути:

HttpServletRequest request = (HttpServletRequest) servletRequest; 
HttpSession session = request.getSession(); 
if (session != null) { 
    SessionDispatcher.Monitor.lookupSessionMonitor(session).touchSession(); 
} 

Или поместите это в файл web.xml, чтобы обновлять при каждом обращении к URL в пределах определенного шаблона:

<filter> 
    <filter-name>Touch Session</filter-name> 
    <filter-class>com.icesoft.faces.webapp.http.servlet.TouchSessionFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>Touch Session</filter-name> 
    <url-pattern>/seam/remoting/*</url-pattern> 
</filter-mapping> 
1 голос
/ 17 апреля 2009

ICEfaces имеет внутренний механизм для поддержки сессий (этот механизм иногда называют «биением сердца»). Вы можете посмотреть принадлежащую документацию и настроить упомянутые параметры (особенно heartbeatInterval и heartbeatTimeout ) в своем web.xml .

0 голосов
/ 17 апреля 2009

Ajax-мост Iceface имеет API-интерфейсы обратного вызова, например Ice.onSessionExpired(), которые вы можете использовать.

<body id="document:body">
    <script type="text/javascript">
        Ice.onSessionExpired('document:body', function() {
            <!-- Do something here -->
        });
    </script>

Подробнее см. http://www.icefaces.org/docs/v1_8_0/htmlguide/devguide/references4.html#1094786.

0 голосов
/ 15 апреля 2009

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

Если так, то до JSF я всегда расширял неактивные пользовательские сессии через подпольный Javascript, поэтому я буду использовать его и в вашем случае. Практически вы можете создать простой слушатель страниц в Javascript, начиная с:

window.setInterval( expression , msecIntervalTiming );

«выражение» может быть вызванной функцией, в которой вы вызываете некоторую фиктивную JSF, необходимую для поддержания сеанса без перезагрузки текущей страницы, которую посетил пользователь, в прошлом я использовал стандартный frame или iframe для выполнения http-вызовов, теперь с XHR / Ajax тоже проще.

Пример Javascript:

var timerID = null;
function simplePageListener() { // invoked by some user event denoting his absence status
    // here goes all events and logic you need and know for firing the poller...
    if (timerID == null) // avoid  duplicates
        timerID = window.setInterval( "window.startPoller()", msecIntervalTiming );
}
//...
function pollerStart() {
  // make iframe or ajax/xhr requests
}
function pollerStop() {
  // make action like page reloading or other needings
}
//...
function triggeredCleanTimer(timer) { // invoked by some user event denoting his active status
  clearTimeout(timer); // it can be also the global variable "timerID"
  timerID = null;
}

В основном вы используете «timerID» в качестве глобальной ссылки для отслеживания статуса слушателя, поэтому, когда вам нужно активировать «autoextension», вы назначаете ему setInterval. Вместо этого, когда пользователь возвращается на страницу (вызванную каким-либо известным вам событием), вы сбрасываете тайм-аут, останавливая опрос слушателя. Приведенный выше пример, очевидно, подразумевает, что пользователь, когда возвращается, должен перезагрузить страницу вручную .

Однако в вашем конкретном случае я не буду вмешиваться в JavaScript, автоматически генерируемый фреймворком Icefaces. Даже если для ipothesys вы можете периодически моделировать некоторые пользовательские события на невидимых элементах ввода (стиль установлен на «visibility: hidden», абсолютно не на «display: none» ), это приводит к тому, что событие Icefaces не будет останови его и заставь себя работать непрерывно

Такие элементы, как на котором вы можете периодически вызывать вызов события click по

 document.forms["YourDummyForm"]["invisivleButton"].click();

Для использования, смотрите старые великие JS документы Devedge Online: -)

http://devedge -temp.mozilla.org / библиотека / руководства / 2000 / JavaScript / 1,3 / ссылка / window.html # 1203669

...