После выхода нажмите на кнопку возврата кеша

<%
    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); //prevents caching at the proxy server
%>

после выхода из системы, при входе на страницу входа в систему, если вы нажмете кнопку "Назад", будет показана старая страница после входа в систему. Я использую выше 3 строки в jsp, и я включаю это во все мои jsps внутри тега body. это не работает для некоторых jsps. Что нужно учитывать для остановки кэширования после выхода из системы? Если jsp имеет форму с методом Post, этот метод не работает?

В моем действии выхода из системы я делаю это.

Cookie logoutCookie = new Cookie("somename", null);
logoutCookie.setPath("/somename");
logoutCookie.setMaxAge(0);
ServletActionContext.getResponse().addCookie(logoutCookie);

Благодарю.

4 ответа

Решение

Я включаю это во все мои JSPS внутри тега тела

Это может быть слишком поздно, когда HTTP-ответ уже зафиксирован в этот момент. HTTP-ответ будет принят, когда в него уже записано количество символов X, которое в вашем случае будет HTML <head>, Вы должны поместить эти строки в самый верх файла JSP, а не в <body> HTML-представления.


На несвязанной ноте вы делаете огромную ошибку в дизайне, копируя одни и те же строки кода в нескольких файлах. Это не СУХОЙ. Всякий раз, когда вам нужно скопировать код вставки, вы всегда должны остановиться и спросить себя, нет ли единственного места для выполнения конкретного кода. В вашем конкретном случае вы должны были использовать Filter вместо. Конкретный пример см. Также в следующем ответе: запретить пользователю видеть ранее посещенную защищенную страницу после выхода из системы. Кроме того, написание Java-кода в JSP - плохая практика. Проверьте, как избежать Java-кода в файлах JSP?

Кроме того, ваш метод выхода из системы странный. Не храните имя пользователя в каком-либо специальном cookie. Вы в основном заново изобретаете сессию. Просто сохраните зарегистрированного пользователя как атрибут сеанса, сделайте недействительным весь сеанс и отправьте перенаправление.

request.getSession().invalidate();
response.sendRedirect(request.getContextPath() + "/home.jsp");

Для получения дополнительной информации о работе сессии прочитайте это: Как работают сервлеты? Инстанциация, сессии, общие переменные и многопоточность

Если вы используете кнопку возврата из браузера, вы ничего не можете сделать. Страница всегда будет приходить из кеша.

Просто убедитесь, что вы сделали недействительным сеанс, когда пользователь нажимает кнопку выхода. Таким образом, когда пользователь нажимает "назад" и пытается использовать страницу, он будет перенаправлен на страницу входа (если ваш сайт запрограммирован правильно).

[РЕДАКТИРОВАТЬ]

Вот заголовок, который мы поместили, чтобы не иметь кеша для http 1.1:

httpResponse.setHeader("Cache-Control", "private,no-store,no-cache");

Ты пытался response.setHeader("Cache-control","no-store"); response.setHeader("Pragma","no-cache"); response.setDateHeader("Expires", -1);? Я думаю, что вы пропустили цитаты в нужном месте..

Создайте атрибут сеанса, скажем, "действительный", и инициализируйте его любым значением, отличным от нуля, в jsp, сразу после того, как учетные данные для входа были сопоставлены. Теперь создайте файл verify.jsp со следующим кодом:

<%
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
if(session.getAttribute("valid")==null)
{
    out.println("<script>parent.location.href='login.jsp'</script>");
}
%>

Теперь просто включите этот файл JSP на каждой странице JSP и все готово. Не забудьте написать "session.invalidate();" в logout.jsp

Надеюсь, это сработает..!!!

Другие вопросы по тегам