Asp.net MVC訪問框架頁中嵌套的iframe頁面時,如果session或cookie過期,登錄驗證超時怎樣自動跳轉到登錄頁


一般登錄驗證的過濾器中,使用驗證過濾器的Redirect方法,將請求重定向到指定的URL。但是如果我們要訪問的頁面是一個嵌套在框架頁中的iframe頁面時,這種重定向只會對iframe頁面湊效,也就是會將iframe也重定向到登錄頁,這樣就有違我們的目的了。所以我就嘗試了很多方法來實現讓整個頁面重定向到登錄頁的目標,接下里我就來分享一下我的心路歷程~~如果想看解決方法,可以直接拉到最后,忽略我的啰啰嗦嗦~~

 

首先,我嘗試了替換掉Redirect,改用了Write方法,意在將指定字符串寫入HTTP響應輸出流,如下:

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掉了。

 

藍后,我就又去求助師父了,師父說:可以通過過濾器返回一個標識,前端js獲取標識之后跳轉登錄頁。因為是在iframe子頁面請求controller被攔截了,但是iframe框架頁得不到被攔截的信息,在js中就可以通過父子頁面通信處理這個問題了。

我仿佛明白了什么,但是潛意識覺得這個有點麻煩,然后師父又說了:你要是有時間的話,就把這個項目重構掉吧! 

我。。。。。。。

 

我內心是拒絕的,發揮咸魚精神,我鍥而不舍的去搜索各種方法,不斷嘗試,終於發現了一個相當可行的方法,具體看代碼:

划重點啦!!!

 第一步,過濾器中依然使用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上,也同樣行得通,我的目的就此達成啦~~

撒花~~撒花~~

 

當然,作為一個小菜鳥,也是參考了很多別人的東西,這個方法也算是個笨方法吧,如果大家有更好的方法,也歡迎多多評論交流~~

感謝各位觀看,獻花~

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM