当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何控制与浏览器后退按钮一起使用的网站页面访问》经验,为你挑选了0个好方法。

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

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

默认页面具有以下条件:

  
    
  

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

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

  
    
  

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

  
    
  

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

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

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

  
    

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

    

“菜单”页面上有一个“注销”按钮,可删除sessionStorage.MemberData变量并使用户返回到上一页“登录页面”。

由于sessionStorage.Page值仍设置为“ Menu”,因此Login页面的Page Access Check将用户转到其上一个页面Default。

这些页面需要使用浏览器的后退按钮才能很好地播放。

  
    
  

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

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

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

*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”。

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

历史记录堆栈是后进先出堆栈。当您在页面之间导航时,上一页地址将被放置在堆栈中。返回时,页面将按照“后进先出”的顺序重新加载。

通常,对于LIFO堆栈,每次返回时,都应从堆栈中删除该条目。但这会阻止您使用“前进”按钮返回到原始页面。而且,只要堆栈中的所有条目均未更改,您就可以随意在历史记录堆栈中上下移动。

但是,如果修改条目,则该点的所有条目Forward都将变为无效,并且由于尚未从该新页面建立“ Forward”路径而应将其删除。并且由于已分配了修改的条目,因此应将其放置在当前页面的顶部,而不是替换它,并且应该删除其上方的所有其他条目。

更新:

该问题可能源于时间问题。问题是“何时将地址放置在“历史记录”堆栈上?”

与jQuery一样,某些代码仅在页面准备就绪后才能执行。也许是因为在页眉处理过程中页面被重定向,所以在文档准备好之前,更新历史记录堆栈的代码没有机会执行。

关于这一点有什么想法吗?

更新2:

我试图将页面访问代码从HEAD移到jQuery内部

$(document).ready(function(){...});

希望这将延迟location.assign()到页面完全加载之后,从而可以正确更新历史记录。那没有解决问题。

location.assign("Menu.asp")仍然替换堆栈中的Default.asp的条目。此外,我已经注意到,正向条目不会从堆栈中删除,因为我相信只要改变堆栈就应该删除。

 Menu   <- Not Removed
 Login  <- Not Removed
*Menu
 New Tab

也许有人有其他可行的方法?

德克萨斯州霍华德·帕尔·卡多·米尔斯

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有