自制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框架的插件与拦截器基础,布布扣,bubuko.com

时间: 2024-11-13 12:40:54

自制MVC框架的插件与拦截器基础的相关文章

自制MVC框架CRUD操作、列表、分页显示插件介绍

这里涉及到的操作都是引用自Stephen.DALService数据层.数据访问层实现方式在后文中我会仔细的说明,先说明一下数据操作集成的插件. 1).InsertAttribute 用于插入记录. 状态返回值:假定hashtable传递变量名的是context ,那么返回值可通过context[InsertAttribute.ValueKey]得到,推荐返回的是插入的主键ID值,当然这个是由数据层设定的. 有以下属性可进行设置: 属性名 作用 默认值 选项说明 其它说明 Key 映射路径.格式如

【struts2】拦截器基础

1)拦截器是什么? 拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制.来回顾一下官方给出的Struts2系统架构图中关于拦截器的部分,如下图所示: 这个图清晰的描述出了拦截器的运行地位,就是用来负责在Action执行之前和Result执行之后处理一些功能的类.也就是说,上图示意了有3个拦截器的类,分别是Interceptor1.Interceptor2和Interceptor3,它们分别执行不同的

java框架篇---struts实现拦截器

Struts2的拦截器和Servlet过滤器类似.在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法. Struts2拦截器类必须从com.opensymphony.xwork2.interceptor.Interceptor接口继承,在Intercepter接口中有如下三个方法需要实现: void destroy(); void init(); St

好记性不如烂笔头49-javaWeb框架struts2中的拦截器(4)

1. Struts2的拦截器概述 Struts2拦截器是在访问某个Action或Action的某个方法之前拦截,或者在运行之后处理.Struts2拦截器是可插拔的,拦截器是AOP(Aspect Oriented Programming,面向切面编程)的一种实现 Struts2的拦截器栈(InterceptorStack)就是将拦截器按一定的顺序联结成一条链.在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用. Struts2规定用户自定义拦截器必须实现com

WebService框架CXF实战一拦截器Interceptor(四)

拦截器(Interceptor)是CXF功能最主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加很多功能.拦截器和JAX-WS Handler.Filter的功能类似,当服务被调用时,就会创建一个拦截器链(Interceptor Chain),拦截器链在服务输入(IN)或输出(OUT)阶段实现附加功能. 拦截器可以在客户端,也可以在服务端添加.当客户端发起一个WebService请求时,在客户端会创建输出拦截器链,服务端接收到客户端的后,会创建输入拦截器链.当服务端返回响应消息时,响应消

(十一)拦截器基础

二.自定义拦截器应用 2.1 第一个自定义拦截器 index.jsp <body> <a href="<%=path%>/Interceptor/InterceptorAction">此页面跳转的action会被自定义拦截器拦截</a> </body> struts.xml <package name="default" namespace="/Interceptor" exten

MyBatis 插件之拦截器(Interceptor)

参考 https://blog.csdn.net/weixin_39494923/article/details/91534658 //项目实际使用 package com.yueworldframework.core.mybatis; import com.yueworldframework.core.support.SessionHelper; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mappi

由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理

最近在用mybatis做项目,需要用到mybatis的拦截器功能,就顺便把mybatis的拦截器源码大致的看了一遍,为了温故而知新,在此就按照自己的理解由浅入深的理解一下它的设计. 和大家分享一下,不足和谬误之处欢迎交流.直接入正题. 首先,先不管mybatis的源码是怎么设计的,先假设一下自己要做一个拦截器应该怎么做.拦截器的实现都是基于代理的设计模式设计的,简单的说就是要创造一个目标类的代理类,在代理类中执行目标类的方法并拦截执行拦截器代码. 那么我们就用JDK的动态代理设计一个简单的拦截器

ssm框架拦截器

1.ssm框架的拦截器是在springmvc-servlet.xml配置文件中进行配置 <!-- 拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="cn.com.***.controller.common.SecurityInterceptor"> <!-- 不需要session验证