我如何控制与浏览器后退按钮一起使用的网站页面访问-NOT .htaccess

问题描述 投票:4回答:1

我在“标题”部分中使用Java脚本和sessionStorage变量来控制网页的查看;以确保执行正确的登录和前提事件。在此示例中,我将使用3页,即“默认”,“登录”和“菜单”页。

目的是防止通过地址栏直接访问“登录”和“菜单”页面,而不先访问“默认”页面。

默认页面具有以下条件:

  <head>
    <script>
      <!-- Page Access Check -->
      sessionStorage.Page="Default";
      if(sessionStorage.MemberData){
        sessionStorage.Page="Menu";
        location.assign("Menu.asp");
      }
    </script>
  </head>

默认页面是网站的访问点,所有用户都必须在此输入。 sessionStoreage.Page变量指示允许显示的页面。在随后的代码示例中,此变量的目的将变得更加明显。

如果当前用户已经成功登录,因此不需要再次登录,则将设置sessionStorage.MemberData。因此,将sessionStorage.Page变量设置为“ Menu”,并将用户定向到Menu页面。

  <body>
    <script>
      $(document).ready(function(){
        <!-- Initialize Event Handlers -->
        $("#LoginButton").one("click",function(){
          sessionStorage.Page="Login";
          location.assign("Login.asp");
        });
      });
    </script>
  </body>

“默认”页面上有一个链接到“登录”页面的按钮,成功登录后,会将用户带到“菜单”页面。登录按钮将sessionStorage.Page变量设置为“登录”,并将用户定向到登录页面。

  <head>
    <script>
      <!-- Page Access Check -->
      switch(sessionStorage.Page){
        case "Login":                   // Page Allowed
          break;
        default:
          history.back();
      }
    </script>
  </script>

到达登录页面后,将检查sessionStorage.Page变量,如果该值设置为“ Login”,则授予对该页面的访问权限。否则,用户将被引导回他们来自的页面,即先前所在页面的“默认”页面。

    sessionStorage.MemberData=JSON.stringify(MemberData);
    sessionStorage.Page="Menu";
    location.assign("Menu.asp");

成功登录后,将设置sessionStorage.MemberData(请参阅默认页面中的检查),将sessionStorage.Page变量设置为“ Menu”,并将用户定向到Menu页面。

  <head>
    <script>
      <!-- Page Access Check -->
      switch(sessionStorage.Page){
        case "Menu":                     // Page Allowed
          break;
        default:
          history.back();
      }
    </script>

到达菜单页面后,将检查sessionStorage.Page变量,如果该值设置为“ Menu”,则授予对该页面的访问权限。否则,用户将被引导回到他们来自的页面,在大多数情况下为“登录”页面。

    <script>
      $("#LogoutButton").one("click",Logout)

      function Logout(){
        sessionStorage.removeItem("MemberData");
        history.back();
      }
    </script>

“菜单”页面具有一个“注销”按钮,该按钮将擦除sessionStorage.MemberData变量并使用户返回上一页,即“登录页面”。

由于sessionStorage.Page值仍设置为“ Menu”,因此登录页面的页面访问检查会将用户发送到其上一页,默认。

这些页面需要与浏览器的后退按钮配合使用。

  <head>
    <script>
      <!-- Page Access Check -->
      switch(sessionStorage.Page){
        case "Menu":                    // Page Allowed
          break;
        case "Admin":                   // Back From
          sessionStorage.Page="Menu";
          break;
        default:
          history.back();
      }
    </script>
  </head>

在此示例中,用户可以使用后退按钮从管理页面导航回到菜单页面。在这种情况下,sessionStorage.Page变量仍设置为“ Admin”,并且检查将失败。随后的检查允许管理员成功返回。

现在,话虽这么说,这就是问题所在:浏览器历史记录堆栈未按预期工作。

从新的浏览器标签中,我导航到默认页面。查看历史记录堆栈,我可以看到“新选项卡”在上一页的位置,而没有下一页。

*Default
 New Tab

单击“默认”页面上的“登录”按钮会将我带到“登录”页面。现在,历史记录堆栈在前一页显示“默认”和“新选项卡”,而在下一页则不显示。

*Login
 Default
 New Tab

单击后退按钮可使我返回到默认页面。现在,历史记录堆栈在上一页显示“新建选项卡”,在下一页显示“登录”。

 Login
*Default
 New Tab

单击前进按钮前进到登录页面,使我返回到默认页面。这是因为sessionStorage.Page变量仍设置为“默认”。历史记录堆栈保持不变。

成功登录并进入菜单页面后,历史记录堆栈现在显示“登录”,“默认”和“新建选项卡”。没有下一页。

*Menu
 Login
 Default
 New Tab

到目前为止,一切都按预期进行。

从“菜单”页面,我单击“后退”按钮。我所看到的是我所期望的:我被发送回Login页面,并且因为sessionStorage.Page变量仍设置为Menu,Login页面将我发送回Default页面。因为存在sessionStorage.MemberData变量,所以将我发送到“菜单”页面。

所以,这就是我希望历史记录堆栈包含的内容:

             Back         Back        Assign

*Menu        Menu        Menu       *Menu
 Login      *Login       Login       Default
 Default     Default    *Default     New Tab
 New Tab     New Tab     New Tab

但是,这是历史记录堆栈的实际情况。

 Menu
 Login
*Menu
 New Tab

在默认页面的页面访问检查中,这使我们转到菜单页面,似乎执行了“ location.replace”而不是“ location.assign”。

[这破坏了我的页面导航,因为单击菜单页面上的注销按钮会将我带到新建选项卡,而不是默认页面。

我不知所措,无法理解这种意外行为。任何帮助将不胜感激。

Howard Parr
Caddo Mills, TX
javascript browser-history
1个回答
0
投票

在我看来,意外行为是由history.back()和location.assign()的组合引起的,当您浏览历史记录堆栈并在那里分配一个新站点时,就好像您要创建一个新站点一样。在历史记录的时间轴中输入。

如果是这种情况,我希望历史记录栈看起来像这样:

     Menu
     Login
     *Menu
     Default
     New Tab

默认自动分配给history.back(),因此在这里就像一个看不见的步骤-它实际上在那儿,但是当您返回到它时,总是会到达菜单。

© www.soinside.com 2019 - 2024. All rights reserved.