个人理解:Asp.net过滤器,其实就是在ControllerActionInvoker
中放置了供用户注入对客户请求处理的对象(是个集合收集收入注入的处理对象),根据处理的时机不同分为5中处理对象。
过滤器的定义
过滤器:就是服务器对用户请求的处理流程中设置过滤(如设置是否继续处理,还是返回等操作)。Asp.net MVC的过滤器设置基于AOP设计,在一些非业务的逻辑在过滤其中实现。
Asp.net MVC中主要执行流程在ControllerActionInvoker
中,即在ControllerActionInvoker
执行中会调用过滤器。其中有5种过滤器,如果自定义需要实现某个中过滤器的接口。
注意 如果自定的过滤器执行需要注入
过滤器的提供机制
为了方便用户实现自己的过滤并注入,这里采用同ModelMetadata
ModelBinder
ModelValidator
注入方式。
Filter
Filter
是对过滤器的封装,其中Instance
为真正的过滤器,其中Order
为同种过滤器多个的执行顺序,Scope
为过滤器范围。
FilterProvider
IFilterProvider
为Filter
的提供者,系统提供三种。
FilterProviders
静态类包括IFilterProvider
类型的集合,当查找Filter
时通过遍历所有IFilterProvider
得到的所有符合的Filter
提供器名 | 原理 |
---|---|
FilterAttributeFilterProvider | 实现FilterAttribute类,通过ControllerDescriptor 和ActionDescriptor 得到特性在提取 |
ControllerInstanceFilterProvider | Controller 实现过滤器,将Controller 封装到Filter |
GlobalFilterCollection | 将Filter 添加到静态集合 |
注入方式
注入方式即怎样才能被上面三种IFilterProvider
得到
- 过滤器继承FilterAttribute,在需要的
Controller
或Action
上标注 - 重写Controller过滤器调用过滤方法(这种不需要定义过滤器,但复用好,每个
Controller
都需重写) - 将定义的
Filter
直接加入GlobalFilterCollection
过滤器的执行
过滤器是怎样在ControllerActionInvoker
中调用的呢?
- 首先
FilterProviders.Providers.GetFilters
获得所有的过滤器 FilterInfo
通过IOverrideFilter
将过滤器分为5类,(对Filter
中的Instance
的类型判断,这里没法利用泛型因每种过滤器的方法不同)- 在不同的时机调用不同的过滤器
五种过滤器
IAuthenticationFilter
为用户的认证,AuthenticationContext
继承ControllerContext
,所有可以利用Respose
将登陆成功的票据发给客户端,如果合法请求可设置ControllerContext
通过:AuthenticationAttribute
属性方式注入
public interface IAuthenticationFilter
{
//根据用户请求实施认证
void OnAuthentication(AuthenticationContext filterContext);
//将认证发送给用户 一般不需要重写
void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext);
}
IAuthorizationFilter
授权检验,对认证的用户角色验证
public interface IAuthorizationFilter
{
void OnAuthorization(AuthorizationContext filterContext);
}
系统提供的有:
AuthorizationAttribute
标注角色认证RequireHttpsAttribute
https重定向ValidateInputAttribute
对用户输入验证ValidateAntiForgeryTokenAttribute
防止跨站点请求伪造ChildActionOnlyAttribute
是Controller
下某个方法不可以通过http直接调用,可用View
中调用作为部分html
IActionFilter
IActionFilter
是在Action的执行前后过滤
public interface IActionFilter
{
void OnActionExecuting(ActionExecutingContext filterContext);
void OnActionExecuted(ActionExecutedContext filterContext);
}
通过属性ActionFilterAttribute
注入
IExceptionFilter
异常过滤器,从认证用户到整个方法执行出现异常触发
public interface IExceptionFilter
{
void OnException(ExceptionContext filterContext);
}
通过HandleErrorAttribute
注入方法
IResultFilter
View呈现时前后执行
public interface IResultFilter
{
void OnResultExecuting(ResultExecutingContext filterContext);
void OnResultExecuted(ResultExecutedContext filterContext);
}
通过ActionFilterAttribute
属性注入