Как отличить выход из системы от сеанса с истекшим сроком действия? - PullRequest
6 голосов
/ 22 июля 2010

Случай 1: Выйти: Как только мы выйдем из системы, если кто-то попытается получить доступ к предыдущему, он должен автоматически перенаправить на login.jsp

Случай 2: Сессия истекла: если сессия истекает, когда пользователь все еще вошел в систему, он должен попытаться автоматически перенаправить на sessionExpired.jsp при доступе к предыдущей странице.

Как дифференцировать? В настоящее время я отключаю сеанс при выходе из системы.

Ответы [ 3 ]

8 голосов
/ 22 июля 2010

При входе в систему установите cookie с длительным сроком действия (> 24 часа).Удалите этот файл cookie во время выхода из системы, установив для параметра maxage значение 0.

Вы можете проверить наличие любого пользователя, не вошедшего в систему (т. Е. Неверный идентификатор сеанса).Если cookie не существует, перенаправьте его на login.jsp

Если cookie существует, это означает, что его сеанс истек, поэтому перенаправьте его на session-expired.jsp

7 голосов
/ 22 июля 2010

Вы можете проверить сеансы с истекшим сроком, проверив, не вернет ли HttpServletRequest#getRequestedSessionId() null (что означает, что клиент отправил cookie сеанса и, следовательно, предполагает, что сеанс все еще действителен) и HttpServletRequest#isRequestedSessionIdValid() возвращает false (что означает, что сеанс истек на стороне сервера).

В орехе:

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

    if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) {
        response.sendRedirect(request.getContextPath() + "/sessionexpired.jsp");
    } else if (session == null || session.getAttribute("user") == null) {
        response.sendRedirect(request.getContextPath() + "/login.jsp");
    } else {
        chain.doFilter(request, response);
    }
}

Не нужно суетиться с дополнительным печеньем.Сопоставьте это Filter с url-pattern, охватывающим защищенные страницы (и, следовательно, исключая сессии с истекшим сроком действия и страницы входа!).

Не забудьте отключить кэширование страниц браузером на защищенных страницах, в противном случаеwebbrowser загрузит их из кэша, когда вы вернетесь в историю браузера, вместо того, чтобы отправлять новый запрос на сервер.Вы можете достичь этого, выполнив следующие действия в том же фильтре: до Chain#doFilter() вызова.

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
1 голос
/ 22 июля 2010

Если бы это был я, я бы очистил сеанс при выходе из системы и создал в нем логическое значение с именем HasLoggedOut, а затем установил для него значение true. Затем, если этот bool существует в сеансе, вы знаете, что он вышел из системы, если нет, то сеанс либо истек, либо пользователь вообще не вошел в систему.

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

"К сожалению, мы не знаем, кто вы, либо время сеанса истекло, либо вы еще не вошли в систему, пожалуйста, войдите ниже"

Это обслуживает оба сценария

...