MVC-AOP(面向切面编程)思想-Filter 三种注册方式
在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还是方便了很多的,各司其职,使用起来也更加方便,使得业务逻辑不受框架的干扰,而且扩展起来也很方便,身份验证,异常处理等一些公用的逻辑和业务逻辑机本上完全分离. 用户登录->异常处理->日志处理->缓存处理
MVC-AOP(面向切面编程)思想-Filter 三种注册方式的更多相关文章
- MVC-AOP思想-Filter 三种注册方式
在ASP.NET MVC框架中,为我们提供了四种类型的Filter类型包括:IAuthorizationFilter.IActionFilter.IResultFilter.IExceptionFil ...
- 论AOP面向切面编程思想
原创: eleven 原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg [前言] AOP(Aspect-Oriented Programming ...
- MVC-AOP(面向切面编程)思想-Filter之IExceptionFilter-异常处理
HandleErrorAttribute MVC中的基本异常分类: Action异常 T view异常 T, service异常 T, 控制器异常 F(异常get不到), ...
- 什么是AOP面向切面编程思想
一.什么是AOP? 1.AOP不是一种语言,是一种编程范式 常见的编程范式: 面向过程.面向对象.函数式编程.事件驱动编程等 2.AOP可以解决特定问题,不能解决所有问题. 3.是面向对象的补充,不是 ...
- 【原创】Android AOP面向切面编程AspectJ
一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...
- 谈一谈AOP面向切面编程
AOP是什么 : AOP面向切面编程他是一种编程思想,是指在程序运行期间,将某段代码动态的切入到指定方法的指定位置,将这种编程方式称为面向切面编程 AOP使用场景 : 日志 事务 使用AOP的好处是: ...
- AOP面向切面编程的四种实现
一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...
- AOP(面向切面编程)大概了解一下
前言 上一篇在聊MemoryCache的时候,用到了Autofac提供的拦截器进行面向切面编程,很明显能体会到其优势,既然涉及到了,那就趁热打铁,一起来探探面向切面编程. 正文 1. 概述 在软件业, ...
- AOP 面向切面编程, Attribute在项目中的应用
一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...
随机推荐
- zstack相关学习的博客
https://segmentfault.com/u/camile/articles?page=1
- 30个你 “ 不可能全部会做 ” 的javascript题目-答案解释
题目链接:http://www.cnblogs.com/0603ljx/p/4458127.html 1,D map对数组的每个元素调用定义的回调函数并返回包含结果的数组.["1" ...
- Gogland配置- 去掉Go源代码中的参数提示
Gogland处于好意,在Go源代码中对每个参数提示类型,这或许方便大家处理源代码,但是我觉得对于正常阅读源代码反而造成一种负担,我决定去掉这个功能! Gogland默认配置状态,有参数提示: 下面是 ...
- Linux基础实验(二)
一)基础实验: 1. 新建文件a.txt,并用权限模式.权限值两种方式修改权限为rwxrwx--x 新建文件:touch a.txt 权限模式:chmod ug=rwx o=x a.tx ...
- forword和重定向有什么区别?
一.forword 1.请求只能从同一个web中转发,当前应用之外的找不到. 2.地址栏不变. 3.共享request对象,请求链不断. 4.永久性跳转,最常用. 5.客户端方法功能跳转 二.重定向 ...
- python 去除字符串的首末两端的空白字符
my_str = " adsffff adsfsad " my_str.strip() 使用strip()默认将 str 两端的空白字符去除掉 同时还有rstrip() 和 lst ...
- css 实现关闭按钮 X
.close::before { content: "\2716";} 然后就显示出来了 这里有个更直接的例子 <!DOCTYPE html> <html lan ...
- [Objective-C语言教程]动态绑定(32)
动态绑定确定在运行时而不是在编译时调用的方法. 动态绑定也称为后期绑定. 在Objective-C中,所有方法都在运行时动态解析.执行的确切代码由方法名称(选择器)和接收对象确定. 动态绑定可实现多态 ...
- [Objective-C语言教程]多态(26)
多态性这个词表示有许多形式. 通常,当存在类的层次结构并且通过继承相关时,会发生多态性. Objective-C多态表示对成员函数的调用将导致执行不同的函数,具体取决于调用该函数的对象的类型. 考虑下 ...
- jdk(1.8)命令行工具(二)
2.3 jinfo:java配置信息工具 jinfo(Configuration Info for Java)的作用是实时的查看和调整虚拟机的各项参数.使用jps -v 可以查看虚拟机启动时显示指定的 ...