Filter拦截器

Aop是MVC的主要设计方式之一,而微软也希望我们在使用MVC的时候更好的使用拦截器来进行切面编程。拦截器则是Mvc中的一大亮点与重点

AOP(面向切面)编程已经广泛应用在各个项目中,切面编程把我们的action切出了执行前与执行后或者是特定的需求比如异常发生时。让我们可以在切面中从容的完成记日志、检查权限等操作。在action中开发人员只需要关于核心业务。

可以看到Controller已经为我们集成了一些Filter接口

IActionFilter  -- >  Action执行前后

IAuthenticationFilter  --> Action安全验证

IAuthorizationFilter    --> Action身份验证

IExceptionFilter           --> Action出现异常时

IResultFilter                 --> 结果返回前后

但是我们的Controller并没有去实现这些接口中的方法,而是留给了子类也就是xxxController我们的控制器去实现。我们可以去重写方法,但是这种方式只能在当前的控制器生效,并不能在其它的控制器中生效,这显然并不是我们想要的。

现在我需要在action执行前去验证一下参数的合法性并适用与所有的Controller,我们可以创建一个Attribute继承IActionFilter和Attribute,更简单的我们可以直接继承ActionFilterAttribute重写OnActionExecuting方法 (actionFilterAttribut继承了IActionFilter与IResultFilter)

下面进行了简单的一个判断,如果UserName为null或者不等于admin就跳转到Error页面

然后再加到action上就可以完成了,但是上面提到了,我们在所有的Controller中都要用到,难道里面每个action都要去加,这太麻烦。 我们可以加到Filter的集合中在Global中进行初化。

浅谈内部原理

这里不对所有的拦截器都演示一次,因为讲起来篇幅挺多的。大多在博客园都可以找到不错的文章。这里讲一下像ActionFilter背后是如何实现的,是如何在action前后进行拦截的

重点其实就在AsyncControllerActionInvoker类中的InvokeActionMethodFilterAsynchronouslyRecursive方法,在这里执行了filter的OnActionExceuting方法,然后判断Result是否为空,否的话就直接到OnActionExecuted不会走action了。 在try里可以看到方法是递归调用的,正常的话会去执行我们的action然后再回到这边调用OnActionExceuted

MVC5-11 浅谈拦截器的更多相关文章

  1. SpringBoot(11) SpringBoot自定义拦截器

    自定义拦截器共两步:第一:注册.第二:定义拦截器. 一.注册 @Configuration 继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本) 旧版本代码 ...

  2. 浅谈装饰器(Python)

    先来了解函数和执行函数在python的区别   我再重新定义一个函数,在函数前面加上@set_func 执行结果如下:   函数前面没有加@set_fun 执行结果如下:   是不是可以不修改原来的函 ...

  3. python3.x 浅谈修饰器

    #装饰器用法,好处#简化代码,避免重复性代码#打印日志 @log#检测性能 @performance#数据库事务 @transaction#URL路由 @post('/register') 简单例子: ...

  4. Python之浅谈装饰器

    目录 闭包函数 装饰器 迭代器 闭包函数 就是将原先需要调用好几遍的函数和参数写入一个包内,下次调用时一起调用 def name(x): x=1 def age(): print(x) return ...

  5. Struts2拦截器介绍

    一.拦截器简介 Struts拦截器和Action的关系如图: 为了在使用拦截器时制定参数值,应通过<interceptor-ref -/>元素添加<param -/>子元素来为 ...

  6. Spring MVC 拦截器 (十)

    完整的项目案例: springmvc.zip 目录 实例 除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式) <!--json-->& ...

  7. 浅谈Struts2拦截器的原理与实现

    拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...

  8. 谈一谈struts2和springmvc的拦截器

    最近涉及到了两个项目,都需要考虑全局的拦截器,其功能就是判断session的登陆状态,如果session信息完好,可以从中取得相应的信息,则放行,否则拦截,进入重定向的uri. 既然是全局的拦截器,其 ...

  9. 浅谈Django的中间件与Python的装饰器

    浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...

随机推荐

  1. GitHub: Windows 下的简单使用

    这段时间在博客园多了很多关于GitHub的文章,但是我的确没怎么看懂.不过这几天简单的看了写资料,亲身操作之后也有了一点体会.这算是最简单的GitHub入门了吧,基本全是鼠标操作.这也是这几天的总结, ...

  2. [云上天气预报-有时有闪电]2月3日23:00-4:00阿里云SLB升级期间网络会闪断

    大家好,2月3日23:00-2月4日4:00,阿里云将对SLB(负载均衡)进行升级,在升级期间,SLB会有约4-8次的网络闪断.由此给您带来麻烦,望谅解! 阿里云官方公告内容如下: 尊敬的用户: 您好 ...

  3. 深入理解计算机系统(2.8)---浮点数的舍入,Java中的舍入例子以及浮点数运算(重要)

    前言 上一章我们简单介绍了IEEE浮点标准,本次我们主要讲解一下浮点运算舍入的问题,以及简单的介绍浮点数的运算. 之前我们已经提到过,有很多小数是二进制浮点数无法准确表示的,因此就难免会遇到舍入的问题 ...

  4. VS2013 未找到与約束ContractName

    vs2013打开项目无法加载项目,关闭时提示  未找到与約束ContractName... 解決方法,打開控制面板,找到下面這個程序 右击,选 择 修 复

  5. iOS -- 神战

    http://github.ibireme.com/github/list/ios/# https://github.com/Tim9Liu9/TimLiu-iOS http://www.ios122 ...

  6. 使用Git时一些问题的处理

    更新日志: 2016.06.04 晚 添加 git push --force (用于删除高版本的commit) 2015.11.29 晚 添加冲突处理工具Meld的教程 添加在GitHub上Rever ...

  7. oracle 删除用户及相关表数据,释放磁盘空间

    来源于:http://www.itpub.net/thread-513609-1-1.html http://bbs.csdn.net/topics/330251089 http://blog.csd ...

  8. CNN中的BN

    w权值的初始化,之前最好的方法是 也就是输入神经元和输出神经元中随机一个数,然后除以输入神经元的个数开根号 因为全连接层波动较大,所以加在FC后面 这里Y,b是为了对信息的一个还原

  9. 谈谈MVC项目中的缓存功能设计的相关问题

    本文收集一些关于项目中为什么需要使用缓存功能,以及怎么使用等,在实际开发中对缓存的设计的考虑 为什么需要讨论缓存呢? 缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例如数据 ...

  10. 管道命令和xargs的区别(经典解释)

    一直弄不懂,管道不就是把前一个命令的结果作为参数给下一个命令吗,那在 | 后面加不加xargs有什么区别 NewUserFF 写道: 懒蜗牛Gentoo 写道: 管道是实现"将前面的标准输出 ...