在ASP.NET MVC框架中,为我们提供了四种类型的Filter类型包括:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter,执行顺序如下:

  IAuthorizationFilter 最先执行的,在这些Filter中,我们可以说它的执行优先级是最高的,用于身份验证并对控 制器中的action进行授等进行逻辑处理

  IActionFilter 在IAuthorizationFilter之后执行,包含两个方法,在controller中的action执行之前、执行之后 进行逻辑处理

  IResultFilter 同样包含两个方法,在IActionFilter之后执行,在返回View之前和返回View之后执行逻辑处理

  IException 主要用于对异常信息进行处理


 首先看下IAuthorizationFilter身份验证,且优先级最高,这里我们override它唯一的OnAuthorization():

 public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute),true))
{
return; //方法上面有这个特性,通过检查
}
else if(filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute),true))
{
return; //控制器上面有特性也可以通过检查
}
//filterContext.HttpContext.Session[""];
//filterContext.HttpContext.Request.Cookies
if (filterContext.HttpContext.Request.QueryString["Account"]!=null && filterContext.HttpContext.Request.QueryString["Account"].Equals("Admin")&& filterContext.HttpContext.Request.QueryString["PWD"].Equals("")&& filterContext.HttpContext.Request.QueryString["PWD"]!=null) //模拟检测,实际检测session和cookie
{
return; //这里身份验证只是模拟,实际中肯定不会这么shit
}
else
{
filterContext.HttpContext.Session["URL"] = filterContext.HttpContext.Request.RawUrl; //当前地址记录给session,登陆后返回当前页面
filterContext.Result = new RedirectResult("~/Home/Contact");
}
//base.OnAuthorization(filterContext);
}

  然后呢,重载完了之后怎么使用呢,上马:

namespace MVC.Controllers
{
[CustomAuthorite] //一:在类上注册,整个类都会调用检查
public class HomeController : Controller
{
/// <summary>
/// 用户登录后才可以访问
/// </summary>
/// <returns></returns>
//[Authorize]
public ActionResult Index()
{ return View();
}
[CustomAuthorite] //二:权限特性,检测权限登录,在方法上注册,只对单个方法有效
public ActionResult About()
{
ViewBag.Message = "Your application description page."; return View();
}
public ActionResult Regex(int year,int month,int day) {
return View();
}
[AllowAnonymous] // 跳过检查
public ActionResult Contact()
{
ViewBag.Message = "Your contact page."; return View();
}
}
}

  还有第三种注册方式:

可以看出以Filter形式给出的,说明它有能力以特性的形式‘贴’在控制器Controller或Action上,让代码更为‘优美’!因为Filter微软也给我们留了‘FilterConfig’入口,可以全局性的‘注入’

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new CustomAuthorite()); //全局注册登录验证Filter
}

  可以看出MVC中的AOP思想较传统的webform还是方便了很多的,各司其职,使用起来也更加方便,使得业务逻辑不受框架的干扰,而且扩展起来也很方便,身份验证,异常处理等一些公用的逻辑和业务逻辑机本上完全分离.             用户登录->异常处理->日志处理->缓存处理

最新文章

  1. 记:MySQL 5.7.3.0 安装 全程截图
  2. ASP.NET实现微信功能(2)(服务号高级群发)
  3. 283 Move Zeroes
  4. Java引用机制——reference
  5. iOS10权限声明国际化
  6. 测试img在不显示时是否加载?
  7. GridView--scroolview嵌套listview和gridview
  8. 2014-9-17二班----7 web project
  9. Dim Loop 出现结果不同
  10. 【UVA1378】A Funny Stone Game (博弈-求SG值-输出方案)
  11. python大文件迭代器的流式读取,之前一直使用readlines()对于大文件可以迅速充满内存,之前用法太野蛮暴力,要使用xreadlines或是直接是f,
  12. 纯Lambda实现斐波那契数列
  13. js-组件-轮播
  14. zoj 1539 Lot 简单DP 记忆化
  15. poj2524 解题报告
  16. Ext表单验证
  17. 第二十八条:利用有限制通配符来提升API的灵活性
  18. redis 高可用
  19. 冒泡排序 最好O(n)平均O(n^2) 选择排序O(n2) 插入排序O(n2)
  20. join 关键字

热门文章

  1. Codeforces Gym 100513F F. Ilya Muromets 水题
  2. 操作日期时间类 Calendar类
  3. iOS出现 _OBJC_CLASS_$_ZSHomeServiceDataElementGroupLargeImage&quot;, referenced from:以及linker command failed with exit code 1 (use -v to see invocation)的错误分析
  4. [agc006f] Blackout 神题
  5. robot framework踩坑记录
  6. deepin配置反向代理映射本地到公网
  7. 【vim】简介与基本配置
  8. dubbo服务器启动后报错端口被占用
  9. android Studio 运行不显示avd 无法运行
  10. NSObject 中执行Selector 的相关方法