Как отличить выход и сессия истекла?

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

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

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

3 ответов


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

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

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


вы можете проверить истекшие сеансы, проверив, если 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 покрытие защищенных страниц (и таким образом кроме страниц sessionexpired и логин!).

не забудьте отключить кэширование страниц браузером на защищенных страницах, иначе 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.

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

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

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

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