我在“标题”部分中使用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
在我看来,意外行为是由history.back()和location.assign()的组合引起的,当您浏览历史记录堆栈并在那里分配一个新站点时,就好像您要创建一个新站点一样。在历史记录的时间轴中输入。
如果是这种情况,我希望历史记录栈看起来像这样:
Menu
Login
*Menu
Default
New Tab
默认自动分配给history.back(),因此在这里就像一个看不见的步骤-它实际上在那儿,但是当您返回到它时,总是会到达菜单。