Как дифференцироваться между выходом из системы, и сессия истекла?

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

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

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

6
задан JoseK 5 August 2010 в 05:56
поделиться

3 ответа

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

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

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

9
ответ дан 8 December 2019 в 13:43
поделиться

Вы можете проверить истекшие сессии, если 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);
    }
}

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

Не забудьте отключить кэширование браузером защищенных страниц, иначе браузер будет загружать их из кэша при возврате в историю браузера, вместо того чтобы посылать новый запрос на сервер. Этого можно добиться, выполнив следующее в том же фильтре, перед вызовом 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.
7
ответ дан 8 December 2019 в 13:43
поделиться

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

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

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

Это подходит для обоих сценариев

1
ответ дан 8 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: