注销后阻止显示以前的页面

时间:2010-08-12 12:05:28

标签: php button logout back

我正在使用PHP应用程序,但我遇到了麻烦,事实上当用户退出并在退出浏览器的后退按钮后按下时,他可以看到上一页,好像会话尚未被销毁:( (我已经尝试了我在这里和网上找到的所有内容,但它不起作用:'(

我可以禁用后退按钮吗?

6 个答案:

答案 0 :(得分:2)

http://blog.priyakant.com/2014/09/23/browser-back-button-prevent/

要点:

浏览器后退按钮 - 在注销后阻止显示以前的页面 - 基于Cookie的方法 由Priyakant Patel于2014年9月23日发表 - 发表评论 注销后阻止显示以前的页面

客户端浏览器应用程序缓存页面以了解性能原因。在这种情况下,当用户点击后退(浏览器后退按钮)时,它会显示缓存中的上一页。

案例1:用户仍然登录。

可以显示上一页的内容。

案例2:用户已注销。

潜在的下一个用户可以点击浏览器后退按钮,可以看到上一页的内容。

在许多应用中,这可能是个大问题。在金融应用中,下一个用户潜力可以看到财务数据或医疗/病人相关的应用程序可能违反HIPAA,公司可能面临重大处罚。

那么让我们回到这一点,如何解决这个问题呢?

我建议使用基于HTTP Cookie的方法。

步骤:

使用滑动过期从服务器端创建HTTP Cookie。可以从客户端JavaScript访问(注意:浏览器在到期时清除此Cookie) 注销时清除此cookie 如果您没有找到此Cookie,请重新加载该页面。在这种情况下,服务器重新验证页面,如果需要,它将重定向到登录页面
就是这样,完成!

这是我使用ASP.NET的实现。实施将根据服务器技术而有所不同,但想法保持不变。

  1. (服务器端)。使用滑动过期从服务器端创建HTTP Cookie

    Response.SetCookie(new HttpCookie(“TimeoutCookieName”, "1") { Expires = DateTime.UtcNow.AddMinutes(10) });
    //NOTE 10 == Session Timeout. This will be same as your application login session timeout.
    
  2. (服务器端)。注销时清除此cookie

    Response.SetCookie(new HttpCookie(“TimeoutCookieName”, "1") { Expires = DateTime.UtcNow});
    
  3. (客户端):(以下脚本必须在BODY标记后立即存在)

    window.preventBackButton = function () {
        try {
            if (document && (!document.cookie || document.cookie.indexOf('_tc=1') < 0)) {
                window.document.body.style.display = 'none'; window.location = window.location;
            }
        } catch (e) { }
    };
    window.preventBackButton(); //Call immediately after body tag
    
  4. 请查看ASP.NET实现如下:

    ////C# Helper class - Start
    using System;
    using System.Web;
    
    namespace MyHelpers {
        public static class MyHtmlHelper {
            public const string TimeoutCookieName = "_tc";
    
            public static HtmlString PreventBackButtonScript(HttpResponseBase response) {
                response.SetCookie(new HttpCookie(TimeoutCookieName, "1") { Expires = DateTime.UtcNow.AddMinutes(10) });
                var clientScript = "window.-reventBackButton = function() {
                    try {
                        if(document && (!document.cookie || document.cookie.indexOf('" + TimeoutCookieName + "=1') < 0)) {
                            window.document.body.style.display='none'; window.location = window.location;
                        }
                    } catch(e) {}
                };
                window.preventBackButton();";
    
                return new HtmlString(clientScript);
            }
    
            public static void SafeUnSetTimeoutCookie(this HttpResponseBase response) {
                response.SetCookie(new HttpCookie(TimeoutCookieName, "0") { Expires = DateTime.UtcNow.AddYears(-5) });
            }
        }
    }
    ////C# Helper class - End
    //Shared\_Layout.cshtml
    //Make sure not to include after logout OR login page
    <html>
    <body>
    @MyHelpers.MyHtmlHelper.PreventBackButtonScript(Response)
    .
    .
    <⁄body>
    <⁄html>
    

答案 1 :(得分:1)

这可能更多地与您在每个页面请求上发送回的缓存标头有关。您的内容仅在短时间内有效,因此您需要确保在生成页面时发回标题,告知浏览器不要在本地缓存它。

在此处禁用页面缓存的示例http://www.w3schools.com/php/func_http_header.asp

// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");

答案 2 :(得分:0)

您无法在用户的浏览器上禁用后退按钮。这是浏览器的一个基本功能,无法覆盖。

如果用户返回,您可以使应用程序中断(显示错误消息,要求用户重新开始或重新提交请求)。这样做是个坏主意,因为在您设计应用程序时,您确实没有考虑后退按钮。每个应用程序,甚至订单,购物车等,如果设计正确,都应该能够使用后退按钮。

我看到打破后退按钮使用的一种方法是在应用程序内的每个URL上以及每个表单中传递一个令牌。令牌在每个页面上重新生成,一旦用户加载新页面,之前页面中的任何令牌都将失效。

当用户加载页面时,页面将仅显示是否向其传递了正确的令牌(已提供给上一页上的所有链接/表单)。

我银行提供的网上银行应用程序是这样的。如果您完全使用后退按钮,则无法再使用链接,也无法再进行页面重新加载 - 相反,您会看到一条告知您无法返回的通知,而且您必须重新开始。

那就是说,我应该提醒你,当用户回来时,你的应用程序会中断,这是一个坏主意,并且显示应用程序设计不佳。

答案 3 :(得分:0)

您是否正在清除用户的缓存/会话?即使他们回击我也不认为如果你在注销时清除他们的会话就应该让他们登录。

答案 4 :(得分:0)

您无法禁用后退按钮。如果您可以看到以前注销的用户页面,那么会话检查脚本会在某处失败。提交注销表单时使用流程脚本,然后将当前注销的用户重定向到主页面(如果适用)。

答案 5 :(得分:0)

你做不到。浏览器会缓存页面,因此每次加载页面时都不必从Web服务器请求它。当您点击后退按钮时,它会在不询问服务器的情况下加载最后一页。