Как отличить выход из системы от истекшего сеанса?

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

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

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


person Prabhat    schedule 22.07.2010    source источник


Ответы (3)


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

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

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

person JoseK    schedule 22.07.2010
comment
Спасибо. Я собираюсь это реализовать. - person Prabhat; 22.07.2010
comment
если я попытаюсь воссоздать файл cookie с помощью плагина веб-разработчика firefox, код может выйти из строя. - person Dead Programmer; 20.08.2010

Вы можете проверить сеансы с истекшим сроком действия, проверив наличие HttpServletRequest#getRequestedSessionId() не возвращает null (это означает, что клиент отправил файл cookie сеанса и, следовательно, предполагает, что сеанс все еще действителен) и _ 3_ возвращает 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);
    }
}

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

Не забудьте отключить кеширование страниц браузером на защищенных страницах, иначе веб-браузер загрузит их из кеша, когда вы вернетесь в историю браузера, вместо того, чтобы отправлять новый запрос на сервер. Вы можете добиться этого, выполнив следующие действия в том же фильтре перед 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.
person BalusC    schedule 22.07.2010
comment
Если я перенаправляю с одной страницы на другую, скажем, страницу типа входа (выберите логин Google или логин по умолчанию) на страницу входа, оба происходят до входа в систему, перенаправляет ли приведенный выше код на страницу с истекшим сроком действия? - person Dileep; 07.02.2014
comment
Вы поняли приведенный выше ответ, но что произойдет, если мы реализуем механизм базовой аутентификации http ... перед тем, как перейти к любому URL-адресу или сервлету на стороне сервера, он отправит 401 клиенту ... как поступить в этом случае? - person mohammed sameen; 07.08.2017
comment
Просто замените аутентификацию FORM, если вам нужен более точный контроль. - person BalusC; 07.08.2017
comment
я не могу заменить механизм базовой аутентификации http аутентификацией FORM, без этого я хочу реализовать - person mohammed sameen; 08.08.2017

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

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

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

Затем это обслуживает оба сценария.

person Gavin    schedule 22.07.2010
comment
Спасибо. Это хорошая идея, однако отображение того, что вы новый пользователь или время ожидания сеанса истекло, выглядит не очень хорошо. - person Prabhat; 22.07.2010