jsp - 防止用户在注销后看到以前访问过的安全页面

标签 jsp servlets logout back-button browser-history

我的要求是最终用户在注销/注销后不应返回受限页面。但目前,最终用户可以通过浏览器后退按钮、访问浏览器历史记录甚至在浏览器地址栏中重新输入 URL 来完成此操作。

基本上,我希望最终用户在注销后不能以任何方式访问受限页面。我怎样才能最好地实现这一目标?我可以使用 JavaScript 禁用后退按钮吗?

最佳答案

可以但不应该禁用浏览器后退按钮或历史记录。这对用户体验很不利。有一些 JavaScript hack,但它们并不可靠,而且当客户端禁用 JS 时它们也不起作用。

您的具体问题是请求的页面是从浏览器缓存加载的,而不是直接从服务器加载的。这本质上是无害的,但确实让最终用户感到困惑,因为他/她错误地认为它确实来自服务器。

您只需要指示浏览器缓存所有受限制的JSP页面(因此不仅仅是注销页面/操作本身!)。这样,浏览器被迫从服务器而不是从缓存请求页面,因此服务器上的所有登录检查都将被执行。您可以使用 Filter 来执行此操作设置 necessary response headersdoFilter() 方法中:

@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/41398519/

相关文章:

java - 当登录用户关闭浏览器时,如何强制 Tomcat 删除过期的 session ?

java - 带有另外 2 个 servlet 的调度程序

java - 如何从服务器读取文本文件并在 index.jsp 中显示文本

php - facebook 从网站登录和注销?

swift - 如何重置所有全局变量?

javascript - 如何在javascript中显示小数点后两位数

eclipse - 如何通过 JSP 中的按钮单击来调用函数

spring - 为什么我需要一个 View 类来解析 Spring MVC 中的 JSTL View ?

java - 为什么我的 jSTL <c :if test ="(should be true)"> returning even the false items?

JSF 身份验证注销