Как различать, является ли запрос не аутентифицированным или сеансовым таймером [дубликат]

Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.

Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.

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

3 ответа

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

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

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

8
ответ дан JoseK 29 August 2018 в 00:15
поделиться
  • 1
    Благодарю. Я собираюсь реализовать это. – Prabhat 22 July 2010 в 08:20
  • 2
    если я пытаюсь воссоздать файл cookie с помощью плагина веб-разработчика Firefox, код может не работать. – Dead Programmer 20 August 2010 в 12:39

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

Не нужно беспокоиться о дополнительных файлах 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.
7
ответ дан BalusC 29 August 2018 в 00:15
поделиться
  • 1
    Если я переадресовываюсь с одной страницы на другую, давайте скажем страницу типа входа (выберите google login или login по умолчанию) на страницу входа, как это происходит до входа в систему, так и выше кода, перенаправленного на страницу с истекшим сроком действия сессии? – Dileep 7 February 2014 в 10:59
  • 2
    Понял вышеприведенный ответ, но что произойдет, если мы реализуем HTTP-механизм проверки подлинности. Прежде чем ударить по любому URL-адресу или сервлету на стороне сервера, он выкинет 401 клиенту. Как справиться в этом случае? – mohammed sameen 7 August 2017 в 07:22
  • 3
    Просто замените на аутентификацию FORM, если вы хотите более мелкозернистый контроль. – BalusC 7 August 2017 в 08:33
  • 4
    я не могу заменить HTTP-механизм аутентификации аутентификацией FORM, без этого я хочу реализовать – mohammed sameen 8 August 2017 в 08:41

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

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

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

. Затем это зависит от обоих сценариев

1
ответ дан Gavin 29 August 2018 в 00:15
поделиться
  • 1
    Благодарю. Это хорошая идея, однако показ вашего нового пользователя или сеанс тайм-аута выглядит не очень хорошо. – Prabhat 22 July 2010 в 08:19
Другие вопросы по тегам:

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