ASP.NET MVC5教学之过滤器(上)

什么是过滤器?mvc中的每一个请求,都会分配给相应的控制器(controller)和对应的行为方法(action)去处理,那么如果我们想要在action处理的前后加上一些额外的处理逻辑怎么办呢?这时候就用到了过滤器(filters)。
在asp.net mvc的请求处理过程中有19个管道事件,这些事件分布在请求处理的各个节点中,比如beginrequest(开始处理请求时触发)、authenticaterequest(对请求进行身份验证时触发)、authorizerequest(对请求进程授权时触发)…等等等等。而过滤器的主要作用就是将我们的附加逻辑注入到这些请求处理管道中。
在实际业务中,在action方法前后添加额外附加逻辑的情况有很多,过滤器就是用来完成此功能。通过过滤器可以将与业务逻辑无关但经常需要执行的代码分离开,使我们的代码逻辑性更加清晰,代码更加简洁。
过滤器的类型与作用mvc给我们提供了四种过滤器,基本满足了我们实际业务中常用的需求,包括以下:
类型名称实现的接口默认的实现类作用
授权过滤器 iauthorizationfilter authorizeattribute 用于限制进入控制器或控制器的某个行为方法
动作过滤器 iactionfilter actionfilterattribute 用于进入动作方法之前或之后的处理
结果过滤器 iresultfilter actionfilterattribute 用于动作方法返回结果之前或之后的处理
异常处理过滤器 iexceptionfilter handleerrorattribute 用于处理某个动作方法或某个控制器里面抛出的异常
这四种类型的接口是mvc对过滤器的一个接口规范,同时mvc默认通过authorizeattribute(授权)、handleerrorattribute(异常处理)、actionfilterattribute(动作和结果)三个类实现了这四个接口。
需要注意的是actionfilterattribute类既实现了iactionfilter接口,也实现了iresultfilter接口。这是个抽象类,要求必须提供一个实现,authorizeattribute和handleerrorattribute类则包含了一些有用的特性,可以不必创建派生类进行使用。所以我们一般都会通过继承actionfilterattribute类,实现自定义的过滤器。
除以上接口之外,我们还要用到filterattribute类,这个类将我们的过滤器包装成了特性,使我们的过滤器可以方便的在action方法上方使用。
定义过滤器过滤器有以下几个特点:
可用于动作方法(action)可用于控制器(controller)可多个filter可同时使用不同级别可以混搭可运用于基类的过滤器,会影响该基类的所有派生类下面我们逐一介绍下基本过滤器的使用方法。
授权过滤器所有实现了iauthorizationfilter接口的都可以称之为授权过滤器。它的接口定义如下:
namespace system.web.mvc{ // // 摘要: // 定义授权筛选器所需的方法。 public interface iauthorizationfilter { // // 摘要: // 在需要授权时调用。 // // 参数: // filtercontext: // 筛选器上下文。 void onauthorization(authorizationcontext filtercontext); }}授权过滤器是最先运行的过滤器,它运行在其它过滤器和action方法之前。客户端请求在调用action之前,mvc框架会检测action上是否有授权过滤器,如果有会调用onauthorization方法,如果此方法批准了请求,才会调用相应的action。流程如图:
mvc默认使用authorizeattribute实现了iauthorizationfilter接口,所以我们可以在action方法上直接添加authorize特性标签来验证授权:
打开index页面,会显示无权限:
由于使用的是mvc自带的授权验证方法,未能符合它的验证机制,所以无权限查看。通常我们需要添加一个新的派生自authorizeattribute类的授权过滤器来完成我们自己业务逻辑。
下面我们自定义一个授权过滤器。我们在mvc项目中添加一个filters文件夹,我们所有自定义的过滤器都放可以到这个文件夹下,便于管理。
在filters下创建一个类,类名为myauthorizeattribute。需要注意,过滤器要以attribute结尾,这是mvc的约定。代码如下:
public class myauthorizeattribute : authorizeattribute{ //重写授权检查方法,返回值为true,允许访问,false,禁止访问。 protected override bool authorizecore(httpcontextbase httpcontext) { //请求参数user为空,禁止访问 if (string.isnullorempty(httpcontext.current.request.querystring[user])) { return false; } return true; }}可以看到,我们只要重写authorizecore方法就可以根据我们的业务需求判断是否有权限访问,返回值为true允许访问,返回值为false禁止访问。
回到homecontroller,我们给about方法加上我们自定义的特性:
我们看看效果:
可以看到,当about页面没有user参数时,会提示无权限,有user参数则可以访问通过。
在实际业务中我们可以使用授权过滤器来管理用户登录状态的授权验证。当然,我的这个例子只是基础的用法,实际业务比这复杂的多,那么就需要我们自己去思考设计授权过滤器方法了。
动作过滤器动作过滤器需要实现iactionfilter接口,接口定义如下:
//// 摘要:// 定义操作筛选器中使用的方法。public interface iactionfilter{ // // 摘要: // 在执行操作方法后调用。 // // 参数: // filtercontext: // 筛选器上下文。 void onactionexecuted(actionexecutedcontext filtercontext); // // 摘要: // 在执行操作方法之前调用。 // // 参数: // filtercontext: // 筛选器上下文。 void onactionexecuting(actionexecutingcontext filtercontext);}我们看到该接口里有两个方法onactionexecuting和onactionexecuted,前者在动作方法执行前调用,后者在动作方法执行后调用。
onactionexecuting方法是在action方法执行前调用的,那么我们可以利用这个方法来检测请求,并且可以在这里修改请求,取消请求等等操作。
客户端的请求信息是一个actionexecutingcontext对象,它继承自controllercontext类,属性如下:
名称类型说明
actiondescriptor actiondescriptor 获取或设置操作描述符。
actionparameters idictionary 获取或设置操作方法参数。
result actionresult 获取或设置由操作方法返回的结果。
我们添加一个自定义的action过滤器。由于actionfilterattribute类实现了iactionfilter接口,所以我们直接继承actionfilterattribute类即可,并且重写onactionexecuting和onactionexecuted方法。如下:
public class myactionattribute : actionfilterattribute{ /// /// action调用之前运行 /// /// public override void onactionexecuting(actionexecutingcontext filtercontext) { if (string.equals(filtercontext.httpcontext.request.httpmethod, get, stringcomparison.currentcultureignorecase)) { filtercontext.result = new httpnotfoundresult(只允许post请求!); } } /// /// action调用之后运行 /// /// public override void onactionexecuted(actionexecutedcontext filtercontext) { }}我们给index方法添加上myaction特性标签:
打开index页,显示如下:
可以看到,页面返回了404错误,提示信息为我们设置的message。

芯片设计流程你真的都知道吗?
广州铭创通讯科技有限公司加入深圳市汽车电子行业协会
揭秘苹果搭载的A9芯片续航差异真相
2019年中国机器人产业发展情况分析
基于传感器和无线通信技术的智能照明解决方案分析
ASP.NET MVC5教学之过滤器(上)
苹果重点研发芯片和传感器 专家发布量子计算机最新趋势
芯华章将如何实现高端EDA工具的国产替代?
耐腐蚀加热管 四氟乙烯加热管 铁氟龙加热管 螺旋状加热管 昆山晟华
如何回收印刷电路板和印刷电路板的材料
微雪电子人工智能物联网开发套件介绍
光伏电池板的特性及种类
解决方案丨法大大电子签:智慧银行建设背后的“助推器”
美国研发出了一种新型的3D皮肤打印技术
小米MIUI8.2稳定版发布,红米Note3暂不支持
EP9去美国拿下了无人驾驶第一,那蔚来怎么看Roborace锦标赛?
tda2822 工作电压及各引脚工作电压
苹果进一步推动可穿戴设备发布新款AirPods
SR73F大角度避障77GHz毫米波雷达在智慧驾培的应用
半导体市场一路飙升至13077亿美元的背后