有一些網頁的內容是有時效性的,甚至有一些操作是不可逆的,但是瀏覽器的歷程記錄(History)卻會逆轉這些特性,在使用者按下「上一頁」的那一刻,不該出現的卻出現了、不該消失的卻消失了,怎麼會這樣?
這個跟瀏覽器的 Cache 策略有關係,我們開發的 ASP.NET MVC 應用程式部署在 IIS 上時,預設的回應標頭 Cache-Control 會帶 private 值。
這是什麼意思? 意思就是說允許瀏覽器在本地端緩存這一次的回應結果,這會使得使用者在按上一頁下一頁瀏覽歷程記錄的時候,瀏覽器不會重新發送要求,而是輸出緩存的結果,這就造成不該出現的卻出現了、不該消失的卻消失了的現象,底下是一個案例,在新增資料後網頁沒有重新導向回列表頁,使用者沒辦法只好按上一頁,而剛剛新增的資料卻消失了,必須重新整理網頁才會出現。
如果我們不需要瀏覽器這麼多事,該怎麼做? 其實只要告訴瀏覽器不要緩存這一頁的結果就好了,在 Cache-Control 塞入這三個值 no-cache
、no-store
、must-revalidate
瀏覽器就不會緩存回應結果,那要怎麼塞? 只要在該 Action 中加入下面兩行程式碼就行了。
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
我們也可以做成 ActionFilter 以利在多個 Action 中重複使用
public class NoStoreAttribute : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");
}
}
加了之後,即使是用按上一頁的方法瀏覽到這一頁,瀏覽器也會重新發送要求。