ASP.NET MVC的过滤器
何谓过滤器
过滤器又名为筛选器,能够为我们优雅的处理某一类需求提供解决方案,比如用户登录、自定义数据上下文初始化、捕获异常、发布公告等。从功能性上来讲过滤器没什么与优势,即过滤器可实现的功能也可以通过传统 命令式编程 方式实现。之所以推荐使用过滤器编程,是因为过滤器在优化系统/代码结构,提高代码可读性上更优异。
接下来用一个简单的例子说明下,
public class LogErrorFilter : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
LogHelper.LogDetail(filterContext.Exception);
}
}
Filter的使用
-
使用声明的方式在Controller
[LogErrorAttribute]
public class HomeController : Controller
{
public ActionResult Index()
{
throw new NotImplementedException();
}
public ActionResult Login()
{
throw new NotImplementedException();
}
}
LogErrorAttribute将会作用在Index和Login两个Action上
-
使用声明的方式在Action上
public class HomeController : Controller
{
[LogErrorAttribute]
public ActionResult Index()
{
throw new NotImplementedException();
}
public ActionResult Login()
{
throw new NotImplementedException();
}
}
LogErrorAttribute仅会作用在Index一个Action上。
-
将LogErrorAttribute注册到 HttpApplication中,即在Global的Application_Start方法做如下操作
protected void Application_Start() { GlobalFilters.Filters.Add(new LogErrorAttribute()); }
如果项目中存在FilterConfig类,则可以这样操作
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new LogErrorAttribute());
}
这样,LogErrorAttribute就会记录该web项目所有Action引发的异常。
System.Web.Mvc 下的过滤器接口
自定义Authorization Filter
自定义的授权过滤器可以通过继承FilterAttribute和实现IAuthorizationFilter来实现,覆写的接口OnAuthorization
对于需要拦截的请求只需要给AuthorizationContext的Result属性赋值即可。
public class LoginCheckFilterAttribute : FilterAttribute,IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
if (!AuthorizeCore(filterContext)) //具体验证用户的逻辑
{
var url = HttpUtility.UrlEncode(filterContext.HttpContext.Request.RawUrl);
filterContext.Result = new RedirectResult((new UrlHelper(filterContext.RequestContext)).Content("/Login/Index?returnUrl=" + url));
}
}
}