Asp.net MVC访问框架页中嵌套的iframe页面时,若是session或cookie过时,登陆验证超时怎样自动跳转到登陆页

通常登陆验证的过滤器中,使用验证过滤器的Redirect方法,将请求重定向到指定的URL。可是若是咱们要访问的页面是一个嵌套在框架页中的iframe页面时,这种重定向只会对iframe页面凑效,也就是会将iframe也重定向到登陆页,这样就有违咱们的目的了。因此我就尝试了不少方法来实现让整个页面重定向到登陆页的目标,接下里我就来分享一下个人心路历程~~若是想看解决方法,能够直接拉到最后,忽略个人啰啰嗦嗦~~javascript

 

首先,我尝试了替换掉Redirect,改用了Write方法,意在将指定字符串写入HTTP响应输出流,以下:html

public class HandlerLoginAttribute : AuthorizeAttribute
    {
        public bool Ignore = true;
        public HandlerLoginAttribute(bool ignore = true)
        {
            Ignore = ignore;
        }
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (Ignore == false)
            {
                return;
            }
            if (OperatorProvider.Provider.GetCurrent() == null)
            {
                WebHelper.WriteCookie("login_error", "overdue");
          //将指定字符串写入HTTP响应输出流 filterContext.HttpContext.Response.Write(
"<script>top.location.href = '/Login/Index';</script>"); } } }

 这里直接往输出流添加一段脚本——<script>top.location.href = "/Login/Index";</script>,把最顶层页面的连接替换成登陆页的地址,这个方法我在本地验证是能够凑效的,但是把网站发布后部署到IIS上就无用了,问了我师父也是不明就里,他说这种输出流的响应不稳定,可能有的时候能识别到有的时候识别不到,我想反正这个方法也不凑效,那也不必去深究了,哈哈 ,原谅个人咸鱼精神,若是有小伙伴知道为何,欢迎分享呀。前端

总之,这个方法是pass掉了。java

 

蓝后,我就又去求助师父了,师父说:能够经过过滤器返回一个标识,前端js获取标识以后跳转登陆页。由于是在iframe子页面请求controller被拦截了,可是iframe框架页得不到被拦截的信息,在js中就能够经过父子页面通讯处理这个问题了。服务器

我仿佛明白了什么,可是潜意识以为这个有点麻烦,而后师父又说了:你要是有时间的话,就把这个项目重构掉吧! app

我。。。。。。。框架

 

我心里是拒绝的,发挥咸鱼精神,我持之以恒的去搜索各类方法,不断尝试,终于发现了一个至关可行的方法,具体看代码:ide

划重点啦!!!测试

 第一步,过滤器中依然使用Redirect方法进行重定向;网站

public class HandlerLoginAttribute : AuthorizeAttribute
    {
        public bool Ignore = true;
        public HandlerLoginAttribute(bool ignore = true)
        {
            Ignore = ignore;
        }
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (Ignore == false)
            {
                return;
            }
            if (OperatorProvider.Provider.GetCurrent() == null)
            {
                WebHelper.WriteCookie("login_error", "overdue");//将请求重定向到指定的URL
                filterContext.HttpContext.Response.Redirect("/Login/Index");
                return;
            }
        }
    }

 

第二步,在/Login/Index页面作限制,经过过滤器将iframe页面重定向到登陆页面,而后在登陆页脚本中判断当前页是否是顶层页,若是不是,则将当前iframe页面重定向为顶层页。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <div class="wrapper">测试</div>
    <script type="text/javascript">
        $(function () {
            if (window != top) {
                top.location.href = location.href;
            }
        });  
    </script>
</body>
</html>

这种方法在本地运行时没有问题的,而后我也发布以后部署到了服务器的IIS上,也一样行得通,个人目的就此达成啦~~

撒花~~撒花~~

 

固然,做为一个小菜鸟,也是参考了不少别人的东西,这个方法也算是个笨方法吧,若是你们有更好的方法,也欢迎多多评论交流~~

感谢各位观看,献花~

 /****************************我是可爱的分割线*********************************/

相关文章
相关标签/搜索