Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.
Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.
При входе в систему установите cookie с длительным сроком действия (> 24 часа). Удалите этот файл cookie во время выхода из системы, установив maxage в 0.
Вы можете проверить любого пользователя без регистрации (т. Е. Неверный идентификатор сеанса). Если файл cookie не существует, перенаправьте его на login.jsp
Если файл cookie существует, значит, его сеанс истек, поэтому перенаправляйте его на session-expired.jsp
Вы можете протестировать истекшие сеансы, установив, что 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.
Если бы это был я, я бы очистил сессию при выходе из системы и создал в ней bool, называемый HasLoggedOut, и установил бы это значение true. Затем, если этот bool существует в сеансе, вы знаете, что они вышли из системы, если он этого не сделает, сеанс либо был отключен, либо пользователь никогда не вошел в систему.
Поскольку вы все еще не можете различать время ожидания и не регистрируетесь, я обычно принимаю решение, что если они запросят аутентифицированную страницу, я просто отправлю их на страницу тайм-аута сеанса, которая также удваивается как страница входа в систему, которая говорит что-то например,
«К сожалению, мы не знаем, кто вы, либо ваш сеанс имеет тайм-аут, либо вы еще не вошли в систему, пожалуйста, войдите в систему ниже»
. Затем это зависит от обоих сценариев