MVC4的过滤器
过滤器
提供的四种基本类型过滤器接口,IAuthorizationFilter、IActionFilter、IResultFilter和IExceptionFilter,可通过继承对应的接口和FilterAttrbute特性,定义自己的过滤器,也可继承内置的过滤器,重写相应的方法,完成自己的需求。
授权:IAuthorizeFilter 授权过滤器接口,对身份进行验证
活动:IActionFilter 行为过滤器接口, 执行Action方法前后执行逻辑
结果:IResultFilter 结果过滤器接口,提供了在返回结果前后执行方法
异常:IExceptionFilter 异常过滤器接口,可对其设定在出现异常后的处理方式和方法。
一.授权过滤器:
AuthorizeAttribute:授权过滤器特性,继承 FilterAttribute, IAuthorizationFilter
若是要自定义授权特性,可以继承于AuthorizeAttribute,然后重写AuthorizeCore(自定义授权)和HandleUnauthorizedRequest(授权失败执行逻辑)的方法。也可以直接继承于FilterAttribute和IAuthorizationFilter,重写OnAuthorization方法。
二:方法/行为结果过滤器:
自定义方法行为过滤器,只需要继承于ActionFilterAttribute即可,也可根据自己所需,是否继承IActionFilter和IResultFilter,再继承于FilterAttribute,自定义过滤器。
ActionFilterAttribute 继承了IActionFilter,IResultFilter接口,实现了接口方法。
OnActionExecuting:执行Action前执行
OnActionExecuted:执行Action后执行
OnResultExecuting:返回结果前执行方法
OnResultExecuted:返回结果后执行方法
三:异常过滤器
自定义异常过滤器,只需要继承于内置HandleErrorAttribute接口即可。也可自定义异常过滤器,继承于FilterAttribute 和IExceptionFilter.
OnException方法:在抛出异常时执行的方法。启用这个异常功能:
使用异常过滤器,需要两个步骤:
Web.Config 文件配置
<customErrors mode="On"></customErrors>
开启自定义错误配置
使用handleError特性注释动作或控制器类
[HandleError (Order = 1 ,ExceptionType = typeof(sqlException),
View = "错误处理的视图")]
Pubic ActionResult About(){}
Filter执行顺序
根据Order, Scope属性来过滤器的执行顺序,如果Order相同,则根据Scope来最终决定执行顺序。
执行优先级:Global过滤器—>Controller过滤器—>Action过滤器
public enum FilterScope
{
Action = 30,
Controller = 20,
First = 0,
Global = 10,
Last = 100
}
FilterProviders:
为筛选器提供一个注册点,内部有一个FilterCollection类型的Providers属性,可对筛选器集合进行添加,移除等操作。
FilterProviders用于注册FilterProvider的,静态构造器在加载的时候,会默认创建三种类型的对象并将其作为表示FilterProviderCollection集合的Providers属性值,
其构造函数如下:
static FilterProviders()
{
Providers = new FilterProviderCollection();
Providers.Add(GlobalFilters.Filters);
Providers.Add(new FilterAttributeFilterProvider());
Providers.Add(new ControllerInstanceFilterProvider());
}
构造函数中添加了全局过滤器和其他两个Provider对象. GlobalFilters的Filters属性的类型为GlobalFilterConllection。Providers是提供了一个注册点,首先注册全局过滤器
FilterAttribute 与FilterAttributeFilterProvider
FilterAttribute是所有过滤器的基类,其继承于Attribute和IMvcFilter接口.
ControllerDesciptor和ActionDescriptor
分别表示Controller和Action的ControllerDescriptor和ActionDescriptor实现了ICustomAttributeProvider接口,使其保证能使用Action和Controller上以及FilterAttribute上的所有特性。这两个类型也单独的实现了获得FilterAttribute的方法。
Controlles与ControllerInstanceFilterProvider
Controller内部也继承了筛选器的四大特性,可以说Controller本身就是一个过滤器。
ControllerInstanceFilterProvider是针对Controller的特殊的Filter,它的内部的GetFilter方法是通过指定的ControllerContext获得对应的Controller对象,并创建一个对应的Filter,Controller对象作为Filter对象的Instance属性值,这个Scope值为First,所以为第一个执行。
GlobalFilterCollection(全局过滤器集合)
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
//默认注册一个HanderError 过滤器
注册全局过滤器:GlobalFiters.Filters.add(new HanderError());
疑问:
1、Controller上的过滤器与Action中的过滤器什么区别?
Controller 上的过滤器比Action先执行,这是根据内部的FilterScope指定的。Controller上的过滤器应用于整个控制器,而Action的过滤器只应用于当前标识的action方法中。
2.Controller上的过滤器是否会继承父Controller上的过滤器
会的,只要在父Controller上标识了过滤器,其子Controller也会执行这个过滤器。
见演示。
MVC内置的过滤器:
一、OutputCache
它有一个默认的构造器,并有很多属性,这里选择几个说明一下:
·Duration 缓存的时间周期,以秒计
·Location 用于指定输出缓存项的位置
这个属性是一个枚举值:
public enum OutputCacheLocation {
Any, Client, Downstream, Server, None, ServerAndClient } |
默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。
·VaryByParam 定义了一个分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用GET方法属性发送的查询字符串值对应,或与用POST方法 发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括“none”、“*”和任何有效的 查询字符串或POST参数名称。
·Shared 布尔值,用于指明输出缓存是否可以被多个页共享。默认值为false
·CacheProfile 用于定义与该页关联的缓存设置的名称,类似于与配置文件缓存名称关联。
·NoStore 个布尔值,用于决定是否阻止敏感信息的二级存储。
例如:对时间进行缓存,在视图中:
@DateTime.Now.ToString()
为Action添加缓存
[OutputCache(Duration = 60, VaryByParam = "*")]
public ActionResult Example()
{
return View();
}
二、ValidateInput
该Action可以接受Html等危险代码
[ValidateInput(false)]
public ActionResult Example()
{
return View();
}
三、ValidateAntiForgeryTokenAttribute
用于验证服务器篡改。
[ValidateAntiForgeryToken]
public ActionResult Example()
{
return View();
}
CompressFilterAttribute的使用:
1.创建:
2.使用:
3.应用效果:
首先我们看看没有进行GZIP压缩的时候,首页的文件大小是多少?
再来看看执行了GZIP压缩后,文件的大小是多少?
压缩率为 71%。
ValidateAntiForgeryTokenAttribute的使用:
用于验证服务器篡改。模拟表单提交,加上后,可防止跨站攻击。
使用:1.在请求表单中添加:@Html.AntiForgeryToken();
页面上的Html.AntiForgeryToken()会给访问者一个默认为“RequestVerificationToken”的cookie和hide filed。
2. 在目标action上增加[ValidateAntiForgeryToken]特性,它是一个验证过滤器它主要检查
(1)请求的是否包含一个约定的AntiForgery名的cookie
(2)请求是否有一个Request.Form["约定的AntiForgery名"],约定的AntiForgery名的cookie和Request.Form值是否匹配
生成:Html.AntiForgeryToken()调用了AntiForgery静态类的GetHtml方法,它产生一个随机值然后分别存储到客户端cookie和页面的hidden field中。其中cookie的key的名字和页面hidden field的名字是一样的,默认都是"__RequestVerificationToken"。
如果页面中不存在id为” __RequestVerificationToken”的hidden field,或者Cookie中的key和页面中的hidden field 值不相等,则直接抛出HttpAntiForgeryException异常
参考网址:http://www.cnblogs.com/dragon_mail/archive/2011/07/10/2102364.html
http://www.cnblogs.com/ASPNET2008/archive/2010/03/09/1681990.html
http://msdn.microsoft.com/zh-cn/library/gg416513(v=vs.98).aspx
MVC4的过滤器的更多相关文章
- asp.net mvc4 过滤器的简单应用:登录验证
直接上代码,不要说话. ASP.NET MVC4过滤器的简单应用:验证登录 [AcceptVerbs(HttpVerbs.Post)] public ActionResult login(FormCo ...
- MVC4过滤器
MVC4提供的四种基本类型过滤器接口,IAuthorizationFilter.IActionFilter.IResultFilter和IExceptionFilter,可通过继承对应的接口和Filt ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-[过滤器+Cache] 系列目录 上次的探讨没有任何结果,我浏览了大量的文章 ...
- Asp.Net MVC4中的全局过滤器,
可以对整个项目进行全局监控. 新建一个MVC4项目,可以在global.asax文件中看到如下代码: FilterConfig.RegisterGlobalFilters(GlobalFilters ...
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. . ...
- Asp.Net MVC4中的全局过滤器
可以对整个项目进行全局监控. 新建一个MVC4项目,可以在global.asax文件中看到如下代码: FilterConfig.RegisterGlobalFilters(GlobalFilters ...
- MVC4学习笔记之--身份认证过滤器
过滤器作为MVC模式中面向切面编程应用很广泛,例如身份验证,日志,异常,行为截取等.博客园里面的大神对应过滤器的介绍以及很多,MVC4中不同的过滤器也介绍得很清楚.FlyDragon 辉太 禁止吸烟 ...
- MVC4方法行为过滤器例子(用户登录)
在Model文件夹下添加一个类MyActionFilterAttribute继承于ActionFilterAttribute: using System; using System.Collectio ...
- MVC4过滤器(转)
先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...
随机推荐
- poj 2288 Islands and Bridges
题意: 给你一个双向连通图,求 获得权值最大 的 哈密顿通路的 权值 和 这个权值对应的数目: 其中权值计算方法是 列如 ABCD 权值是a+b+c+d+ab+bc+cd 如果 A,B,C 和B ...
- 国内外MD5在线解密网站
-http://www.cmd5.com/english.aspx (457,354,352,282) - http://www.md5crack.com - http://www.hashcheck ...
- Android - 支持不同的设备
世界上有各种不一样形状和大小的Android设备.由于有各种不同类型的设备,你的app可能在各种设备上运行.为了在Android上尽可能的成功,你的app需要使配各种不同的设备.最重要的几点需要考虑的 ...
- POJ 1176 Party Lamps (DFS)
对于一束灯光.提供四种改变彩灯状态(ON<=>OFF)的操作:a.改变全部彩灯状态:b.改变奇数彩灯状态.c.改变偶数彩灯状态:d.改变3k+1号彩灯状态(1,4,7,10...). 给定 ...
- ASP.NET自定义控件组件开发 第一章 第三篇
原文:ASP.NET自定义控件组件开发 第一章 第三篇 第三篇:第一章的完结篇 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待 ...
- NLP | 自然语言处理 - 解析(Parsing, and Context-Free Grammars)
什么是解析? 在自然语言的学习过程,个人一定都学过语法,比如句子能够用主语.谓语.宾语来表示.在自然语言的处理过程中.有很多应用场景都须要考虑句子的语法,因此研究语法解析变得很重要. 语法解析有两个基 ...
- C# 读取IE缓存文件(2)
private void button1_Click(object sender, EventArgs e) { , nBufSize; IntPtr buf; INTERNET_CACHE_ENTR ...
- Hibernate一个简短的引论
我们从几个方面进行阐述Hibernate When? What ? How? When? Hibernate由来是因为当时EJBBean1.1在处理entittBean架构时,花费的时间要比业务逻辑很 ...
- 3.cocos2dx它Menu,由menu为了实现场景切换
1 头文件 TMenu.h #ifndef __TMENU_H__ #define __TMENU_H__ #include "cocos2d.h" USING_NS_CC; ...
- Swing 组件焦点设置
在Swing中,焦点默认是在第一个组件上,所以在项目中想将焦点设置在其他的组件上,如JTextField!但通过requestFocus()方法不起作用,有人提供以下解决方法: 全部初始化之后,jTe ...