`

防止登录之后,利用浏览器的后退功能,返回登录前的页面,在次登录报错

阅读更多

       这个原因要从MVC 中的Html.AntiForgeryToken()说起了,呵呵。

       MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(xss又叫css:Cross-Site-Script),攻击不同,xss一般是利用站内信任的用户在网站内插入恶意的脚本代码进行攻击,而csrf则是伪造成信任用户对网站进行攻击。

      每一次登录的时候都会获取到一个验证码即:key,如: @Html.AntiForgeryToken(),在后台添加一个验证标签 如:

 [HttpPost]
 [ValidateAntiForgeryToken]//验证标签
        public ActionResult Login(LoginModel model)
        {           
        }

      登录完成之后,在利用浏览器的后退功能,返回到登录前的页面,这是利用浏览器的缓存。它获取到的那个key是没有被刷新的,还是原来的,这样再次登录,就会报错了。这种的解决方法应该有多种吧。

      我是写了一个标签,去清除缓存,当后退到登录页面时,是在去刷新页面。这样不是缓存,而是再次刷新页面,重新获取这个key。

     代码如下 清除缓存:

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

        }

 在control加上这个标签:

 [DisableCache]//清除缓存标签
        public ActionResult Login(string ReturnUrl,string type)
        {
            ViewBag.ReturnUrl = ReturnUrl;
            ViewBag.logintype = type;
            return View();
        }

 (二)防止退出登录后 利用浏览器后退功能 回到登出前的页面

完全是处于对信息安全的考虑,因为一般都会设置session来控制用户对一些页面的非法访问。但是session防止不了浏览器的后退。也就是说你退出登录后,如果不关闭页面,还是有可能泄露信息的。下面两种方式,当然并不止两种,而且肯定有更好的方式。

(1)关闭旧页,打开新页:

function co(){
    window.open("");
    window.opener = null;
    window.close();
}

 (2)页面自动刷新一次,这样即使后退,也是看到刷新后,经过session验证的页面

(a)通过url刷新:

function refresh(){
    url = location.href; //把当前页面的地址赋给变量 url
    //分切变量 url 分隔符号为 "#"
    if( url.indexOf("#") == -1){ //如果url后没有#
        url += "#"; //加入 #
        self.location.replace(url); //刷新页面
    }
}

 (b)通过cookie刷新

//自动刷新一次,如果没登录过,新建一个cookie:views 置为1,根据views是否有值判断是否是第一次浏览,如果是第一次就刷新。
function autoRefresh() {
    if (getCookie("views") != 1) {
        document.cookie = "views = 1";
        if (getCookie("view") != 1)
            location.reload()
        else
            refresh();//如果浏览器不允许写cookie 则用url刷新方法,确保万无一失。
    } else{
        delCookie("views");
    }
        
}
function getCookie(name) {
    //获取指定名称的cookie的值
    var arrStr = document.cookie.split("; ");
    for ( var i = 0; i < arrStr.length; i++) {
        var temp = arrStr[i].split("=");
        if (temp[0] == name)
            return unescape(temp[1]);
    }
    return null;
}
 function delCookie(name){
     //为了删除指定名称的cookie,可以将其过期时间设定为一个过去的时间 
     var date = new Date();
     date.setTime(date.getTime() - 10000);
     document.cookie = name + "=a; expires=" + date.toGMTString();
 }

 

 

 

分享到:
评论

相关推荐

    当用户退出点击浏览器后退仍可回到原来页面的解决方案

    解决方案1:禁用缓存,前一次使用的方法,在电脑上各浏览器都没问题,但在ipad、安卓手机上仍有问题 解决方案2:禁用浏览器后退键 [removed] window.history.forward(1); 结果和方案一一样的结果,pad上没效果 ...

    在vue中阻止浏览器后退的实例

    在某些情况下,我们可以在路由守卫中判断用户是否试图导航到未授权的路由,并相应地处理导航,从而间接地阻止用户通过后退按钮返回到特定页面。 最后,值得注意的是,原文中提到的“本文部分内容通过ocr扫描出文档...

    页面禁止各种浏览器后退.txt

    在这个函数中,使用`pushState`方法添加一个新的历史记录,以覆盖用户试图返回的状态,并使用`forward`方法确保用户无法通过浏览器的后退按钮回到前一个状态。 3. **兼容不支持HTML5 History API的浏览器**:对于不...

    浏览器报错HTML.rar

    浏览器报错HTML,静态界面html,通用个系统浏览器筛选。包含各流向浏览器........... 浏览器报错HTML,静态界面html,通用个系统浏览器筛选。包含各流向浏览器...........

    localStorage在安卓内内置浏览器中报错解决

    localStorage在安卓内内置浏览器中报错解决,最好的解决的方法

    javascript实现禁用浏览器后退按钮

    例如,在某些登录验证后的页面,为了防止用户通过后退按钮回到登录前的状态,从而绕过登录验证;或者在某些表单填写完成后,为了避免用户不小心按到后退键导致数据丢失等场景。本文将详细介绍几种使用JavaScript来...

    解决微信授权成功后点击按返回键出现空白页和报错的问题

    微信授权我是 在index.vue做的授权,是一个空白页,因为授权需要回调所以这个页面会刷新两次,当我们授权成功进入主页面后,点击返回键或者点击手机的物理返回键,因为浏览器history机制,按物理返回或者返回肯定是...

    关于ajax支持浏览器后退前进的做法

    然而,传统的浏览器后退和前进按钮在AJAX应用中可能会导致用户体验下降,因为它们可能无法正确反映页面状态的变化。本文将详细介绍如何使用JavaScript来实现AJAX支持的浏览器后退和前进功能,以提供更流畅的导航体验...

    解决手机浏览器点击后退页面刷新问题,兼容苹果 safari浏览器和安卓浏览器

    解决手机浏览器点击后退页面刷新问题,兼容苹果 safari浏览器和安卓浏览器。 js的window.onbeforeunload,onunload,window.addEventListener(‘pagehide‘, () => {}手机浏览器不生效

    栈:如何实现浏览器的前进和后退功能?.pdf

    ### 栈:如何实现浏览器的前进和后退功能...通过上述分析可以看出,栈作为一种简单而高效的数据结构,不仅在理论上有很好的性能表现,而且在实际应用中也非常有用,特别是在实现浏览器的前进后退功能上发挥了重要作用。

    通用浏览器多开CK登录器

    同时,由于CK包含敏感信息,工具的安全性也至关重要,因此"通用浏览器多开CK登录器"应具备加密存储和防止泄露的机制。 其中,“配置.ini”文件是程序的配置信息,通常包含了登录器的设置参数,如默认浏览器路径、CK...

    浏览器页面,禁用刷新

    浏览器页面禁用刷新是一个常见的需求,特别是在开发特定的交互式应用或者进行数据提交时,防止用户意外触发页面刷新导致数据丢失。这篇博客“996-interpage”可能详细讲解了如何在JavaScript或HTML中实现这一功能。...

    js禁止浏览器页面后退功能的实例(推荐)

    在JavaScript编程中,有时我们需要禁用浏览器的默认后退功能,比如在用户完成登录、支付等操作后,防止用户意外点击后退按钮导致数据丢失或出现错误状态。本篇文章将详细解析如何通过JavaScript实现这一功能。 首先...

    ajax 浏览器后退前进按钮功能实现

    本篇将探讨如何在使用Ajax时正确处理浏览器的后退和前进功能。 首先,了解浏览器的后退和前进机制。当用户点击浏览器的后退或前进按钮时,浏览器会根据历史记录中的URL加载相应的页面。在没有Ajax的情况下,每个...

    js 禁用浏览器的后退功能的简单方法

    在某些情况下,我们可能希望用户不能通过浏览器的后退按钮返回到上一个页面,比如在一个支付流程完成后,不希望用户直接返回修改订单。这时就可以利用`history.forward()`来实现这一需求。 ### 知识点三:禁用...

    js页面后退刷新前进

    js页面后退刷新前进

    移动端H5页面返回并刷新页面(BFcache)的方法

    项目中的需求: ...原因:部分浏览器在后退时不会触发onload事件,這是HTML5世代浏览器新增的特性之一——Back-Forward Cache(简称bfcache) 什么是bfcache? bfcache,即back-forward cache,可称为

    基于WebView的安卓android浏览器,基本功能齐全

    在Android平台上,开发一款基于WebView的浏览器是一种常见的实践,它允许开发者利用系统内建的WebView组件来呈现网页内容,而不必依赖于系统内置的浏览器应用。WebView是一个强大的工具,可以集成到任何Android应用...

    JavaScript不刷新实现浏览器的前进后退功能

    通过以上提供的方法和技术,开发者可以在单页面应用中实现不刷新页面的前进后退功能,同时也能保持浏览器历史记录的正常工作,避免了用户在操作浏览器前进后退按钮时的困扰。这对于提升Web应用的用户体验是非常重要...

Global site tag (gtag.js) - Google Analytics