通常登陸驗證的過濾器中,使用驗證過濾器的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上,也一樣行得通,個人目的就此達成啦~~
撒花~~撒花~~
固然,做爲一個小菜鳥,也是參考了不少別人的東西,這個方法也算是個笨方法吧,若是你們有更好的方法,也歡迎多多評論交流~~
感謝各位觀看,獻花~
/****************************我是可愛的分割線*********************************/