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/62002998/

相关文章:

java - 如何将wildfly 17中的 'org.apache.jasper.compiler.Parser.STRICT_WHITESPACE'设置为系统属性?

java - 签署 Java war 文件并将 MANIFEST.MF 包含在 <war root>/META-INF 中是否有效

swift - 从优步叫车请求小部件注销

java - 如何在JAVA中使用rtrim PHP函数

java - Spring启动Jsp文件找不到

java - 尝试通过JSP查询RDF模型时发生错误?

java - 为什么session.invalidate在IE浏览器中不起作用?

java - 允许使用代码时编辑和清理 servlet 中的用户输入吗?

forms - Symfony2 FOSUserBundle – 验证登录时的 "user active"标志

python - Django 自动注销和页面重定向