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

qybjjes1  于 2021-07-08  发布在  Java
关注(0)|答案(5)|浏览(411)

我有一个要求,即最终用户不应该能够返回到受限制的网页后注销/注销。但目前,最终用户可以通过浏览器后退按钮、访问浏览器历史记录,甚至在浏览器地址栏中重新输入url来实现这一点。
基本上,我希望最终用户不应该能够访问任何方式后,注销限制页。我怎样才能做到最好?我可以用javascript禁用back按钮吗?

uqdfh47h

uqdfh47h1#

您可以尝试告诉浏览器不要缓存主页(使用适当的标题-expires、cache control、pragma)。但这并不能保证有效。您可以做的是,在页面加载时对服务器进行ajax调用,以检查用户是否已登录,如果未登录,则进行重定向。

fnvucqvd

fnvucqvd2#

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

    // ...
}

绘制此Map Filterurl-pattern 比如说有兴趣的 *.jsp .

@WebFilter("*.jsp")

或者,如果您只想将此限制放在安全页面上,那么您应该指定一个覆盖所有这些安全页面的url模式。例如,当它们都在文件夹中时 /app ,则需要指定 /app/* .

@WebFilter("/app/*")

更重要的是,你可以用同样的方法做这项工作 Filter 作为检查登录用户是否存在的位置。
测试前不要忘记清除浏览器缓存!;)

另请参见:

用于登录的身份验证过滤器和servlet
如何在所有浏览器中控制网页缓存?

v1l68za4

v1l68za43#

不禁用浏览器back buton的最简单方法是将此代码添加到 page_load 您不希望用户在注销后返回的页面的事件:

if (!IsPostBack)
    {
        if (Session["userId"] == null)
        {
            Response.Redirect("Login.aspx");
        }
        else
        {
        Response.ClearHeaders();
        Response.ClearContent();
        Response.Clear();
        Session.Abandon();
        Session.Remove("\\w+");
        Response.AddHeader("Cache-Control", "no-cache, no-store, max-age = 0, must-revalidate");
        Response.AddHeader("Pragma", "no-cache");
        Response.AddHeader("Expires", "0");
        }
    }
kxeu7u2r

kxeu7u2r4#

正确的方法是添加

Vary: Cookie

安全页面上的标题。当用户注销时,清除他们的会话cookie。然后,当他们注销后返回时,浏览器缓存将丢失。这还有一个好处,就是不会完全破坏缓存。

falq053o

falq053o5#

  • 如果转发页面,url模式中的.jsp将不起作用。尝试也包含servlet。。这将使您的应用程序不受后退按钮问题的影响。

相关问题