MVC清除緩存,可以解決瀏覽器後退鍵帶來的問題

首先講一下授權

首先AuthorizeAttribute 這個Filter實現了IAuthorization這個接口,是Asp.Net MVC提供的認證和授權功能的實現,要實現自己的認證和授權功能只需要繼承AuthorizeAttribute,然後覆蓋它的方法就可以了 。

public class MyAuthAttribute : AuthorizeAttribute
{
   //do something
}


首先重寫 AuthorizeAttribute的OnAuthorization 方法,代碼如下:

public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            if (!AuthorizeCore(filterContext.HttpContext))
            {
                HandleUnauthorizedRequest(filterContext);
            }
            else
            {
                filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            }
        }

filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);

這句代碼就是清除緩存的關鍵。

 


AuthorizeAttribute的OnAuthorization方法內部調用了AuthorizeCore方法,這個方法是實現驗證和授權邏輯的地方,如果這個方法返回true,

表示授權成功,如果返回false, 表示授權失敗, 會給上下文設置一個HttpUnauthorizedResult,這個ActionResult執行的結果是向瀏覽器返回

一個401狀態碼,但是通常還是跳轉到一個登錄頁面,可以重寫AuthorizeAttribute的

 HandleUnauthorizedRequest  方法 :

protected override void HandleUnauthorizedRequest(AuthorizationContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("filterContext is null");
            }
            else
            {
                string path = context.HttpContext.Request.Path;
                string strUrl = "/Account/LogOn?returnUrl={0}";
                
                context.HttpContext.Response.Redirect(string.Format(strUrl, HttpUtility.UrlEncode(path)), true);
                
            }
            
        }

 

 

 

---------------------------------------------------------

也可單獨提取出來清除緩存:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace MobileMvc.Models
{
    public class NoCacheAttribute : ActionFilterAttribute
    {
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            base.OnResultExecuted(filterContext);
        }
    }
}

如此,不需要Cache的Action,簡單的加上Filter即可:.

[NoCache]
public ActionResult PostSomething()     
{     
    //do something...    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章