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上,也一樣行得通,個人目的就此達成啦~~

撒花~~撒花~~

 

固然,做爲一個小菜鳥,也是參考了不少別人的東西,這個方法也算是個笨方法吧,若是你們有更好的方法,也歡迎多多評論交流~~

感謝各位觀看,獻花~

 /****************************我是可愛的分割線*********************************/

相關文章
相關標籤/搜索