通常登陆验证的过滤器中,使用验证过滤器的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上,也一样行得通,个人目的就此达成啦~~
撒花~~撒花~~
固然,做为一个小菜鸟,也是参考了不少别人的东西,这个方法也算是个笨方法吧,若是你们有更好的方法,也欢迎多多评论交流~~
感谢各位观看,献花~
/****************************我是可爱的分割线*********************************/