我的要求是最终用户在注销/注销后不应返回受限页面。但目前,最终用户可以通过浏览器后退按钮、访问浏览器历史记录甚至在浏览器地址栏中重新输入 URL 来完成此操作。
基本上,我希望最终用户在注销后不能以任何方式访问受限页面。我怎样才能最好地实现这一目标?我可以使用 JavaScript 禁用后退按钮吗?
最佳答案
您可以但不应该禁用浏览器后退按钮或历史记录。这对用户体验很不利。有一些 JavaScript hack,但它们并不可靠,而且当客户端禁用 JS 时它们也不起作用。
您的具体问题是请求的页面是从浏览器缓存加载的,而不是直接从服务器加载的。这本质上是无害的,但确实让最终用户感到困惑,因为他/她错误地认为它确实来自服务器。
您只需要指示浏览器不缓存所有受限制的JSP页面(因此不仅仅是注销页面/操作本身!)。这样,浏览器被迫从服务器而不是从缓存请求页面,因此服务器上的所有登录检查都将被执行。您可以使用 Filter 来执行此操作设置 necessary response headers在 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);
}
// ...
}
将此过滤器
映射到感兴趣的url-pattern
,例如*.jsp
。
@WebFilter("*.jsp")
或者,如果您只想将此限制放在安全页面上,那么您应该指定一个涵盖所有这些安全页面的 URL 模式。例如,当它们都在文件夹 /app
中时,则需要指定 /app/*
的 URL 模式。
@WebFilter("/app/*")
更重要的是,您可以在检查登录用户是否存在的同一过滤器
中完成此工作。
测试前不要忘记清除浏览器缓存! ;)
另请参阅:
关于jsp - 防止用户在注销后看到以前访问过的安全页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62002998/