Вы можете и не должны отключать в браузере кнопку «Назад» или историю. Это плохо для пользовательского опыта. Есть хаки 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
где вы проверяете присутствие вошедшего в систему пользователя.
Не забудьте очистить кеш браузера перед тестированием! ;)
Смотрите также: