MVC清除缓存,可以解决浏览器后退键带来的问题

来源:互联网 发布:减肥食谱软件 编辑:程序博客网 时间:2024/05/22 14:53

首先讲一下授权

首先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...    }
原创粉丝点击