2016-04-04 3 views
0

У меня есть веб-приложение с 30-минутным таймаутом сеанса. Дизайн заключается в том, что при отходе сеанса пользователь автоматически выходит из системы и ему необходимо снова войти в систему.Исключить некоторые URL-адреса из таймаута сеанса

Проблема в том, что у меня есть тикер новостей на моей веб-странице, который каждые 5 минут обновляется через вызов AJAX. Атрибут newsticker AJAX естественно сбрасывает тайм-аут сеанса, поэтому пользователи не выходят из системы.

Я думал о внедрении своего детектора бездействия, написав фильтр, который обновляет переменную lastActive (хранящуюся в сеансе) всякий раз, когда пользователь получает/публикует страницу, за исключением тикера новостей.

Тогда я думал, может быть, есть способ исключить определенные вызовы из сброса таймаута сеанса. Поэтому я искал и нашел несколько ответов, относящихся к asp, но ничего для jsp и Weblogic.

Есть ли способ исключить определенные URL: s из сброса таймаута сеанса?

+0

не могли бы вы поставить линеечку в отдельном файле WAR, который имеет свой собственный web.xml, который будет иметь свой собственный тайм-аут? – radimpe

+0

@radimpe Я мог бы, но когда я добавляю то, что мне нужно, это похоже на работу и более сложное решение, чем написание фильтра. В настоящее время приложение имеет только одно веб-приложение. Я также не уверен, как прозрачно обрабатывать такие вещи, как авторизация и аутентификация, со вторым веб-приложением, которое использует отдельные сеансы. –

ответ

0

Поскольку я не мог найти способ сделать это по конфигурации, я закончил тем, что написал фильтр, который делает недействительным сеанс, когда прошло достаточно времени без активности пользователя. У меня уже был другой фильтр, который перенаправляет пользователей без сеанса на страницу входа. Я добавил SessionTimeoutFilter непосредственно перед фильтром авторизации в цепочке фильтров.

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

public class SessionTimeoutFilter 
    implements Filter 
{ 
    private final long TIMEOUT = 1800L; // 30 minutes in seconds 
    private final String LAST_ACTIVITY = "LAST_ACTIVITY"; 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 

     if (request instanceof HttpServletRequest) { 
      HttpServletRequest theRequest = (HttpServletRequest) request; 
      Long now = (new Date()).getTime(); 

      HttpSession session = theRequest.getSession(false); 
      if (session != null) { 
       Long lastActivity = (Long) session.getAttribute(LAST_ACTIVITY); 

       if (lastActivity == null) { 
        // The first call for this session. 
        lastActivity = now; 
       } 
       if (now - lastActivity > TIMEOUT*1000L) { 
        // User timed out. 
        session.invalidate(); 
       } else if (isUserCall(theRequest)) { 
        // Reset inactivity timer 
        session.setAttribute(LAST_ACTIVITY, now); 
       } 
      } 
     } 
     chain.doFilter(request, response); 
    } 

    /** 
    * @return true if the URI indicates user activity, 
    *   false if it is an automatic call 
    */ 
    private boolean isUserCall(HttpServletRequest request) { 
     String uri = request.getRequestURI(); 
     if (uri.contains("NewsTicker")) { 
      return false; 
     } 
     return true; 
    } 
0

@Klas Lindback: У меня нет достаточно привилегий для comment.So я отправляю это как answer.To найти последнюю активность, не нужно вручную calculation.Try следующий метод

session.getLastAccessedTime() 

Oracle docs

в любом случае это не изменит вашу реализацию

+0

'session.getLastAccessedTime()' не делает этого для меня, поскольку он сбрасывается любым вызовом, включая вызовы Ajax newsticker, которые я хочу исключить из расчета таймаута. –

+0

что он сбрасывает? –

Смежные вопросы