ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:168.01KB ,
资源ID:4916305      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4916305.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(课题MVC过滤器详解.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

课题MVC过滤器详解.docx

1、课题MVC过滤器详解MVC过滤器详解APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理。这时候就用到了过滤器。MVC支持的过滤器类型有四种,分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常)。如下表,过滤器类型接口描述AuthorizationIAuthorizationFilter此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法ExceptionIExceptionFilter用于指定一个行为,这个被指定的行为处理

2、某个行为方法或某个控制器里面抛出的异常ActionIActionFilter用于进入行为之前或之后的处理ResultIResultFilter用于返回结果的之前或之后的处理但是默认实现它们的过滤器只有三种,分别是Authorize(授权),ActionFilter,HandleError(错误处理);各种信息如下表所示过滤器类名实现接口描述ActionFilterAuthorizeAttributeIAuthorizationFilter此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法HandleErrorHandleErrorAttributeIExceptionFilter用于指

3、定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常自定义ActionFilterAttributeIActionFilter和IResultFilter用于进入行为之前或之后的处理或返回结果的之前或之后的处理下面介绍的过滤器中,除了上面这几种外,还多加一种过滤器OutputCache1 授权过滤器Authorize1.1 默认Authorize使用现在在网上无论是要求身份验证的地方多得是,发邮件,买东西,有时候就算吐个槽都要提示登录的。这里的某些操作,就是要经过验证授权才被允许。在MVC中可以利用Authorize来实现。例如一个简单的修改密码操作 Authorize pu

4、blic ActionResult ChangePassword() return View(); 它需要用户通过了授权才能进入到这个行为方法里面,否则硬去请求那个页面的话,只会得到这个结果如果要通过验证,通过调用FormsAuthentication.SetAuthCookie方法来获得授权,登陆的页面如下model FilterTest.Models.LogInModel Layout = null; Login using( Html.BeginForm() ID:Html.TextBoxFor(m=m.UserName) Password:Html.PasswordFor(m = m.

5、Password) 行为方法如下 Post/这里用了谓词过滤器,只处理POST的请求 public ActionResult Login(LogInModel login) if (login.UserName = admin & login.Password = 123456) FormsAuthentication.SetAuthCookie(login.UserName, false); return Redirect(/Customer/ChangePassword); return View(); 当然有登录也要有注销,因为注销是在登陆之后发生的,没登陆成功也就没有注销,所以注销的行

6、为方法也要加上Authorize过滤器,注销调用的是FormsAuthentication.SignOut方法,代码如下 Authorize public ActionResult LogOut() FormsAuthentication.SignOut(); return Redirect(/Customer/Login); 1.2 自定义授权我们不一定要用MVC默认的Authorize授权验证规则,规则可以自己来定,自定义授权过滤器可以继承AuthorizeAttribute这个类,这个类里面有两个方法是要重写的 bool AuthorizeCore(ContextBase Context

7、):这里主要是授权验证的逻辑处理,返回true的则是通过授权,返回了false则不是。 void HandleUnauthorizedRequest(AuthorizationContext filterContext):这个方法是处理授权失败的事情。这里就定义了一个比较骑呢的授权处理器,当请求的时候刚好是偶数分钟的,就通过可以获得授权,反之则不通过。当授权失败的时候,就会跳转到登陆页面了。 public class MyAuthorizeAttribute:AuthorizeAttribute protected override bool AuthorizeCore(ContextBase

8、 Context) /return base.AuthorizeCore(Context); return DateTime.Now.Minute % 2 = 0 protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) filterContext.Context.Response.Redirect(/Customer/Login); /base.HandleUnauthorizedRequest(filterContext); 然后用到一个行为方法上, MyAuthorize p

9、ublic ActionResult ShowDetail() return View(); 每当偶数分钟的时候就可以访问得到这个ShowDetail的视图,否则就会跳到了登陆页面了。2 处理错误过滤器HandleError2.1 默认HandleError使用在往常的开发中,想到异常处理的马上就会想到try/catch/finally语句块。在MVC里面,万一在行为方法里面抛出了什么异常的,而那个行为方法或者控制器有用上HandleError过滤器的,异常的信息都会在某一个视图显示出来,这个显示异常信息的视图默认是在Views/Shared/Error这个HandleError的属性如下属性

10、名称类型描述ExceptionTypeType要处理的异常的类型,相当于Try/Catch语句块里Catch捕捉的类型,如果这里不填的话则表明处理所有异常ViewString指定需要展示异常信息的视图,只需要视图名称就可以了,这个视图文件要放在Views/Shared文件夹里面MasterString指定要使用的母版视图的名称OrderInt指定过滤器被应用的顺序,默认是-1,而且优先级最高的是-1这个Order属性其实不只这个HandleError过滤器有,其优先级规则跟其他过滤器的都是一样。下面则故意弄一个会抛异常的行为方法 HandleError(ExceptionType = type

11、of(Exception) public ActionResult ThrowErrorLogin() throw new Exception(this is ThrowErrorLogin Action Throw); 光是这样还不够,还要到web.config文件中的一节中添加以下代码因为默认的开发模式中它是关闭的,要等到部署到服务器上面才会开启,让异常信息比较友好的用一个视图展现。像这里访问ThrowErrorLogin视图时,由于抛出了一次,就转到了一个特定的视图在这里看到的异常视图是这样的,除了用这个建项目时默认生成的异常视图之外,我们还可以自己定义异常视图,视图里面要用到的异常信息

12、,可以通过Model获取,它是一个ExceptionInfo类型的实例,例如这里建了一个异常视图如下 Layout = null; MyErrorPage There was a Model.Exception.GetType().Name while rendering Model.ControllerNames Model.ActionName action. Model.Exception.Message Stack trace: Model.Exception.StackTrace 它存放的路径是/Views/Shared里面,像上面的行为方法如果要用异常信息渲染到这个视图上面,在控制

13、器的处改成这样就可以了HandleError(ExceptionType = typeof(Exception), View = MyErrorPage)2.2 自定义错误异常处理这里的错误处理过滤器也可以自己来定义,做法是继承HandleErrorAttribute类,重写void OnException(ExceptionContext filterContext)方法,这个方法调用是为了处理未处理的异常,例如 public override void OnException(ExceptionContext filterContext) /base.OnException(filterC

14、ontext); if (!filterContext.ExceptionHandled & filterContext.Exception.Message = this is ThrowErrorLogin Action Throw) filterContext.ExceptionHandled=true; filterContext.Context.Response.Write(5洗ten No Problem + filterContext.Exception.ToString(); 这里用到的传入了一个ExceptionContext的对象,既可以从它那里获得请求的信息,又可以获取异常

15、的信息,它部分属性如下属性名称类型描述ActionDescriptorActionDescriptor提供详细的操作方法ResultActionResult结果的操作方法,过滤器可以取消,要求将此属性设置为一个非空值ExceptionException未处理的异常ExceptionHandledbool另一个过滤器,则返回true,如果有明显的异常处理这里的ExceptionHandler属性要提一下的是,如果这个异常处理完的话,就把它设为true,那么即使有其他的错误处理器捕获到这个异常,也可以通过ExceptionHandler属性判断这个异常是否经过了处理,以免重复处理一个异常错误而引发

16、新的问题。3 OutputCache过滤器OutputCache过滤器用作缓存,节省用户访问应用程序的时间和资源,以提高用户体验,可这个我试验试不出它的效果。留作笔记记录一下。OutputCacheAttribute这个类有以下属性属性名称类型描述Durationint缓存的时间,以秒为单位,理论上缓存时间可以很长,但实际上当系统资源紧张时,缓存空间还是会被系统收回。VaryByParamstring以哪个字段为标识来缓存数据,比如当“ID”字段变化时,需要改变缓存(仍可保留原来的缓存),那么应该设VaryByParam为ID。这里你可以设置以下几个值:* = 任何参数变化时,都改变缓存。no

17、ne = 不改变缓存。以分号“;”为间隔的字段名列表 = 列表中的字段发生变化,则改变缓存。LocationOutputCacheLocation缓存数据放在何处。默认是Any,其他值分别是Client,Downstream,Server,None,ServerAndClientNoStorebool用于决定是否阻止敏感信息的二级存储。例如一个OutputCache过滤器可以这样使用 OutputCache(Location= System.Web.UI.OutputCacheLocation.Client,Duration=60) public ActionResult Login() re

18、turn View(); 或者有另外一种使用方式使用配置文件,在节点下添加以下设置 使用控制的时候就这样 OutputCache(CacheProfile=testCache) public ActionResult Login() return View(); 4 自定义过滤器万一前面介绍的过滤器也满足不了需求,要在行为方法执行返回的前前后后定义自己的处理逻辑的话,这个自定义过滤器就应该能派上用场了。若要自定义一个过滤器,则要继承ActionFilterAttribute类,这个类是一个抽象类,实现了IActionFilter和IResultFilter接口,主要通过重写四个虚方法来达到在行

19、为方法执行和返回的前后注入逻辑方法参数描述OnActionExecutingActionExecutingContext在行为方法执行前执行OnActionExecutedActionExecutedContext在行为方法执行后执行OnResultExecutingResultExecutingContext在行为方法返回前执行OnResultExecutedResultExecutedContext在行为方法返回后执行四个方法执行顺序是OnActionExecutingOnActionExecutedOnResultExecutingOnResultExecuted。上面四个方法的参数都是

20、继承基ContollorContext类。例如下面定义了一个自定义的过滤器 public class MyCustomerFilterAttribute : ActionFilterAttribute public string Message get; set; public override void OnActionExecuted(ActionExecutedContext filterContext) base.OnActionExecuted(filterContext); filterContext.Context.Response.Write(string.Format( 0

21、Action finish Execute.,Message); public override void OnActionExecuting(ActionExecutingContext filterContext) CheckMessage(filterContext); filterContext.Context.Response.Write(string.Format( 0 Action start Execute., Message); base.OnActionExecuting(filterContext); public override void OnResultExecut

22、ed(ResultExecutedContext filterContext) filterContext.Context.Response.Write(string.Format( 0 Action finish Result., Message); base.OnResultExecuted(filterContext); public override void OnResultExecuting(ResultExecutingContext filterContext) filterContext.Context.Response.Write(string.Format( 0 Acti

23、on start Execute., Message); base.OnResultExecuting(filterContext); private void CheckMessage(ActionExecutingContext filterContext) if(string.IsNullOrEmpty( Message)|string.IsNullOrWhiteSpace(Message) Message = filterContext.Controller.GetType().Name + s + filterContext.ActionDescriptor.ActionName;

24、使用它的行为方法定义如下 MyCustomerFilter public ActionResult CustomerFilterTest() Response.Write(Invking CustomerFilterTest Action); return View(); 执行结果如下这个就证明了上面说的顺序。当控制器也使用上这过滤器时,而行为方法不使用时,结果如下如果控制器和行为方法都使用了过滤器,理论上是显示上面两个结果的有机结合。但实际不然,因为在定义过滤器的时候还少了一个特性:AttributeUsage(AttributeTargets.All, AllowMultiple = tr

25、ue),把这个加在MyCustomerFilterAttribute就行了。 AttributeUsage(AttributeTargets.All, AllowMultiple = true)/多次调用 public class MyCustomerFilterAttribute : ActionFilterAttribute 由这幅图可以看出,同一个过滤器分别用在了控制器和行为方法中,执行同一个方法时都会有先后顺序,如果按默认值(不设Order的情况下),一般的顺序是由最外层到最里层,就是“全局”“控制器”“行为方法”;而特别的就是错误处理的过滤器,由于异常是由里往外抛的,所以它的顺序刚好

26、也反过来:“行为方法”“控制器”“全局”。既然这里有提到全局的过滤器,那么全局的过滤器是在Global.asax文件里面的RegisterGlobalFilters(GlobalFilterCollection filters)中设置的public static void RegisterGlobalFilters(GlobalFilterCollection filters) filters.Add(new HandleErrorAttribute(); filters.Add(new MyFilters.MyCustomerFilterAttribute() Message=Global);/全局过滤器 这里它默认也添加了一个错误处理的过滤器来处理整个MVC应用程序所抛出的异常。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1