按下浏览器后退按钮时,需要将用户导航到登录页面

时间:2013-12-05 10:01:10

标签: javascript asp.net asp.net-mvc

我有一个ASP.net MVC Web应用程序,它由几个页面组成。要求是这样的:

当用户使用该应用程序时,假设用户在第7页,突然用户通过键入外部互联网URL(例如Google.com)导航离开应用程序。

现在,当用户按下浏览器的后退按钮时,我们需要将他重定向到应用程序登录页面的第0页,而不是将其带回第7页。

有没有办法实现这个目标?我们有一个基本控制器,每次加载页面时都会执行,以及母版页(aspx)。我们可以在那里做一些事情,以便可以在所有页面中实现这种行为吗?

4 个答案:

答案 0 :(得分:0)

我可以提供以下想法:

当用户按<a href='external url' onclick='clearHistory'>link</a>时 您可以在所需网址的浏览器历史记录中保存:

<script>  
function clearHistory()
{
  var reternUrl = getReternUrl(); 
  History.pushState({}, null, reternUrl);
}
</script>

更多关于history.js

编辑:确定,然后处理beforeunload事件:

   $(window).on('beforeunload', function () {
                     var reternUrl = getReternUrl(); 
                     History.pushState({}, null, reternUrl);
                });

答案 1 :(得分:0)

编辑:缩短并略微更改代码以更好地回答确切问题(基于对此答案的第一个评论)

除了上面关于用户在浏览器地址栏中输入外部URL的情况下编辑浏览器历史记录的回答。

您可以尝试检测How to detect URL change in JavaScript中发布的网址更改。 使用jquery的示例(从上面链接的帖子稍微拍摄和编辑):

对于较新的浏览器:

$(window).bind('hashchange', function() {
    /* edit browser history */
});

对于旧版浏览器:     function callback(){         / *编辑浏览器历史记录* /     }

function hashHandler(callback){
    this.oldHash = window.location.hash;
    this.Check;

    var that = this;
    var detect = function(){
        if(that.oldHash!=window.location.hash){
            callback("HASH CHANGED - new hash" + window.location.hash);
            that.oldHash = window.location.hash;
        }
    };
    this.Check = setInterval(function(){ detect() }, 100);
}

hashHandler(callback); //start detecting (callback will be called when a change is detected)

我会在书签上找回你(仍然需要检查一下)。

答案 2 :(得分:0)

我认为最好的解决方案是使用iframe并在iframe内部的步骤之间切换。这很容易,因为您不需要重新设计应用程序。每当用户尝试切换到其他网址并返回时,iframe将从第一步再次加载。

请务必在应用程序的每一步禁用缓存。您可以通过将NoCache属性应用于控制器的操作来执行此操作:

public class NoCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        base.OnResultExecuting(filterContext);
    }
}

答案 3 :(得分:0)

这里有2个案例

首先是在线模式的浏览器,在这种情况下,你必须在会话中存储你的最后一页获取请求,如果用户点击后退按钮,它将重新开始再次启动获取请求,您可以陷阱并将其发送到目标网页,您必须小心 获取页面请求只有一次其他行动必须发布。

其次是浏览器处于离线模式,在这种情况下你必须注意你的响应不应该在浏览器中放置任何缓存足迹,有很多代码示例你可以在网上找到这个目的。