MVC框架的插件与拦截器基础
自制MVC框架的插件与拦截器基础
上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器!
在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用。在我的框架中可以通过继承以下抽象类来实现插件或者拦截器。
1. AspectInterceptor抽象类
处理动态织入的AOP拦截器,Stephen.View框架中的拦截器抽象类,所有需要动态拦截器必须实现该类,该拦截器原理是通过aspectsharp实现的。该拦截器适用于控制层的拦截,且要使控制器类支持动态拦截必须给控制器加上DynamicAttribute特性
实现的两个方法
Proceed(IDictionary myContext) 当拦截的方法处理完以后进行的拦截处理,必须有一个hashtable参数传递
Entry(IMethodInvocation invocation) 当拦截的方法还未处理以后进行的拦截处理,参数是方法调用的类(aspectsharp框架类)
配置语法可参见:http://www.cnblogs.com/netcorner/archive/2011/04/01/2911966.html
拦截器实现示例:

[Serializable]
public class RandProductInterceptor : AspectInterceptor
{
public override void Proceed(IDictionary myContext)
{
…
}
}

控制器实现示例:

namespace Jobmate.Controllers
{
[Dynamic] //必须声明,否则无法拦截
public class Default
{
[MyLogin]
public virtual IDictionary Index(IDictionary context) //该方法必须保证为虚方法,否则不能拦截
{
return context;
}
…
}
}

配置拦截器示例:

<configuration>
<configSections>
<section name="aspectsharp" type="AspectSharp.Builder.SectionHandler.AspectSharpConfigurationHandler, AspectSharp"/>
…
</configSections>
<aspectsharp>
<configuration>
aspect processor1 for [Jobmate.Controllers]
pointcut method(* Index(*))
advice(RandProductInterceptor)
advice(ShareInterceptor)
end
end
</configuration>
</aspectsharp>
…
</configuration>

对Jobmate.Controllers包中所有名为Index的方法进行拦截处理.
2. BeforehandCommonAttribute抽象类
静态织入的AOP拦截器,Stephen.View框架中的拦截器抽象类,所有需要静态拦截器必须实现该类,同时静态拦截器必须可被序列化(类上加Serializable
特性),该拦截器原理是通过postsharp实现的.拦截器有两种处理方式:
1).类库生成时必须安装postsharp软件, 且项目类库中加入PostSharp.Laos.dll、PostSharp.Public.dll,但编译之后发布就不需要安装或引入了。
2).拦截器放在网站站点app_code文件夹中是不需要postsharp编译的。
两者方式是不一样的,第一种采用postsharp代码在编译的时候织入,另外一种采用反射原理拦截,前者的效率要高于后者。
拦截器实现示例:

[Serializable] //声明类必须被序列化,否则无法拦截
public class MyLoginAttribute : BeforehandCommonAttribute
{
public override void Beforehand(IDictionary myContext)
{
…
}
}

控制器示例:

namespace Netcorner.Controllers.integration
{
public class Commend
{
[MyLogin(AspectPriority = 1)]
[MyRoleCheck(AspectPriority = 0)]
public virtual new IDictionary ManageList(IDictionary context)
{
…
}
}
}

AspectPriority是postsharp类中对多个拦截器进行优先级设定的方式,值越小说明执行优先级越高,反之者越低。
值得注意的是,这个静态织入的拦截器不一定只能放在方法上的特性,还可以放在类上。

[ShareData(AttributeTargetMembers = @"regex:^(?!.*Action).*$")]
[MyLogin(AttributeTargetMembers = @"regex:^(?!.*Action).*$", AspectPriority = 1)]
[MyRoleCheck(AspectPriority = 0)]
public class Administration
{
[Pagination(AspectPriority = 3, Key = "Jobmate.JM_AM_Employee.Employee")]
[QueryData(AspectPriority = 2)]
public IDictionary EmployeeManage(IDictionary context)
{
…
}
[GUID(AspectPriority = 2)]
[FormData(AspectPriority = 1)]
[UserLogger]
[MyRoleCheck(AspectPriority = 0)]
[BreakRomoteURL(AspectPriority = -1)]
protected object NewAction(IDictionary context)
{
…
}
}

可通过AttributeTargetMembers发生以正则的方式筛选可拦截的方法。如上例中将拦截NewAction方法,而不拦截EmployeeManage
使用可见:http://www.cnblogs.com/netcorner/p/3756585.html
3 ProceedPlugin抽象类
使用同BeforehandCommonAttribute,与BeforehandCommonAttribute不一样的地方是它是在控制器方法执行完以后再拦截的。
演示示例:http://files.cnblogs.com/netcorner/%E7%A4%BA%E4%BE%8B1.rar
MVC框架的插件与拦截器基础的更多相关文章
- 自制MVC框架的插件与拦截器基础
上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以下抽象类来实现插件或者拦截器. 1 ...
- 2017.3.31 spring mvc教程(三)拦截器
学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...
- Dora.Interception,为.NET Core度身打造的AOP框架 [3]:多样化拦截器应用方式
在<以约定的方式定义拦截器>中,我们通过对拦截器的介绍了Dora.Interception的两种拦截机制,即针对接口的“实例拦截”针对虚方法的“类型拦截”.我们介绍了拦截器的本质以及基于约 ...
- java框架之Struts2(4)-拦截器&标签库
拦截器 概述 Interceptor (拦截器):起到拦截客户端对 Action 请求的作用. Filter:过滤器,过滤客户端向服务器发送的请求. Interceptor:拦截器,拦截的是客户端对 ...
- MVC webapi,Action的分别拦截器
继承Controller,ApiController的拦截继承的接口不一样 webapi的拦截器:(继承System.Web.Http) using System; using System.Coll ...
- mybatis自定义插件(拦截器)开发详解
mybatis插件(准确的说应该是around拦截器,因为接口名是interceptor,而且invocation.proceed要自己调用,配置中叫插件)功能非常强大,可以让我们无侵入式的对SQL的 ...
- 【struts2】拦截器基础
1)拦截器是什么? 拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制.来回顾一下官方给出的Strut ...
- java框架篇---struts实现拦截器
Struts2的拦截器和Servlet过滤器类似.在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept ...
- 在SSM框架中我设置拦截器filter不能通过注解获取到实现类
我在用注解注入实现类的时候,出现了这样的错误:如以下截图: 这个地方报出的错误是说明我的一个接口类型的类没有获取到,后来我就想要是我的实现类没有获取到那么我就直接new一个实现类然后再进行调用就会出现 ...
随机推荐
- 数组、链表、Hash(转)
在程序中,存放指定的数据最常用的数据结构有两种:数组和链表. 数组和链表的区别: 1.数组是将元素在内存中连续存放. 链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起. 2.数组 ...
- Oracle 11g+oracle客户端(32位)+PL/SQL develepment的安装配置
之前一直想学Oracle,可是就是安装配置Oracle一直未成功,让人很苦恼,特别是什么监听器什么的,一直没搞明白,弄了整整一天都没弄出来,上网查资料后发现资料上大多数都是参差不齐,不太详细明了,尝试 ...
- JS数据绑定模板artTemplate试用
之前写JS绑定数据曾经用过tmpl库,虽然功能比较强大但是感觉不是很轻量,对于相对简单的数据需求显得有些臃肿.而Ajax返回数据自己拼接html的方式又显得不够高端,因此今天看了一篇介绍artTemp ...
- 添加AD验证(域身份验证)到现有网站
每个网站几乎都会有用户登录的模块,登录就会涉及到身份验证的过程.通常的做法是在页面上有个登录的Form,然后根据用户名和密码到数据库中去进行验证. 而验证后如何在网站的各个页面维持这种认证过的状态,有 ...
- LeetCode——Linked List Cycle II
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...
- iOS ... NS_REQUIRES_NIL_TERMINATION
看到官方的一个样例不错,这里留记. #import <Cocoa/Cocoa.h> @interface NSMutableArray (variadicMethodExample) - ...
- C# ICSharpCode.SharpZipLib
C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用 工作中我们很多时候需要进行对文件进行压缩,比较通用的压缩的dll就是ICSharpCod ...
- 关于JavaScript中计算精度丢失的问题
摘要: 由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JavaScript中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失. 为了避免产生精度差异,把需要计算的数字升级(乘 ...
- 2014阿里实习生面试题——mysql如何实现的索引
这是2014北京站的两副面孔阿里实习生问题扯在一起: 在MySQL中.索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,比方MyISAM和InnoDB存储引擎. MyISAM索引实现: ...
- Java对象比较器对泛型List进行排序-Demo
针对形如:字段1 字段2 字段3 字段n 1 hello 26 7891 world 89 5562 what 55 4562 the 85 452 fuck 55 995 haha 98 455 以 ...