Ви можете та не повинні вимикати кнопку повернення чи історію браузера. Це погано для роботи користувачів. Є хакі JavaScript, але вони не є надійними, а також не працюватимуть, коли у клієнта JS відключений.
Ваша конкретна проблема полягає в тому, що запитувана сторінка завантажується з кешу браузера, а не прямо з сервера. Це по суті нешкідливо, але дійсно заплутано для ендузера, оскільки він / він помилково вважає, що це дійсно з сервера.
Вам просто потрібно доручити браузеру не кешувати всі обмежені сторінки JSP (і, таким чином, не тільки сторінку виходу / саму дію!). Таким чином браузер змушений запитувати сторінку на сервері замість кешу, і тому всі перевірки входу на сервер будуть виконані. Це можна зробити за допомогою фільтра, який встановлює необхідні заголовки відповідей у doFilter()
методі:
@WebFilter
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
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.
chain.doFilter(req, res);
}
// ...
}
Наприклад, картографуйте це Filter
за url-pattern
інтересами *.jsp
.
@WebFilter("*.jsp")
Або якщо ви хочете розмістити це обмеження лише на захищених сторінках, вам слід вказати шаблон URL-адреси, який охоплює всі ці захищені сторінки. Наприклад, коли вони всі знаходяться в папці /app
, вам потрібно вказати шаблон URL-адреси /app/*
.
@WebFilter("/app/*")
Навіть більше, ви можете виконувати цю роботу так само, Filter
як і там, де ви перевіряєте наявність зареєстрованого користувача.
Не забудьте очистити кеш браузера перед тестуванням! ;)
Дивитися також: