一尘不染

退出后防止用户看到以前访问过的安全页面

jsp

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

基本上,我希望最终用户退出后不能以任何方式访问受限页面。我怎样才能做到最好?我可以使用JavaScript禁用后退按钮吗?


阅读 290

收藏
2020-06-08

共1个答案

一尘不染

可以也不应 禁用浏览器的后退按钮或历史记录。这对用户体验不利。有一些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);
    }

    // ...
}

这个地图Filterurl-pattern的兴趣,例如*.jsp

@WebFilter("*.jsp")

或者,如果您只想对受保护页面设置此限制,则应指定一个涵盖所有受保护页面的URL模式。例如,当它们全部位于文件夹中时/app,则需要指定的URL模式/app/*

@WebFilter("/app/*")

甚至,您可以与Filter检查已登录用户的状态相同地执行此工作。

测试前不要忘记清除浏览器缓存!;)

2020-06-08