首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

在AOP基础之下的一个钩子程序实现

2012-09-05 
在AOP基础之上的一个钩子程序实现? 先解释下钩子程序,英文为HOOK。? ?Hook解释  Hook是Windows中提供的一种

在AOP基础之上的一个钩子程序实现

? 先解释下钩子程序,英文为HOOK。

? ?Hook解释

  Hook是Windows中提供的一种用以替换DOS下“中断”的系统机制,中文译为“挂钩”或“钩子”。在对特定的系统事件进行hook后,一旦发生已hook事件,对该事件进行hook的程序就会受到系统的通知,这时程序就能在第一时间对该事件做出响应。

  另一解释:

  钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

  钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

?


钩子程序有利有弊,弊端在于其安全性无法控制,利端是因为它的灵活,适应客户多变的需求, 但是我们并不用修改现有的程序源代码。

?

? ? ? 好,下面我们开始来实现这个HOOK程序,对这个HOOK还不是很理解没关系,只要看完本文,即可完全了解HOOK,淡然HOOK有很多实现模式,这里我仅仅使用注入模式实现,原则上只要稍加变通,即可实现替换模式,修复,破解等等模式。

? ? ?处于对程序的安全考虑,HOOK的控制点都在一个切面上,所以系统利用AOP对业务逻辑的各个部分进行隔离。

?

?

先来看看我一个切面的实现,说白了也就是一个代理,java的代理很多人都做过,我贴出我的全部代理类代码。

挂钩程序都通过一个数据结构表配置起来,然后在每次执行一个业务方法的时候 都必须先判断是否有挂钩程序,有的话,执行挂钩程序逻辑,否则直接执行主业务方法。

? ? ?

?

?

? ? 然后来看? IManager 的实现

?

? ?public interface IManager {

// throw

}

} else {

throw new UserException("错误, 对象必须实现接口ServiceInvoke,错误对象:!"

+ f.getName());

?

}

return proxy;

}

?

private static final String FINAL_SEVICE = "service";

?

private static String getLodObjectPath(String path) throws Exception {

if (StringUtils.isNullOrBank(path)) {

throw new UserException("错误, 对象路径错误,错误对象:!" + path);

}

return path.replaceAll("invoke", FINAL_SEVICE).replaceAll("Invoke", "");

?

}

}


?

?

接下来是一个正在IManager的实现,Manaer 是一个抽象工厂类,获取HanderManager 之用。该类实现了全部的挂钩程序逻辑

?

? ??public class HanderManager extends Manager {

?

?

?好了。HOOK程序完成了。接下来看一个具体的使用.先看看Action的程序

?

?

return "ok";

}

? ? ? //保存方法

? ??public void save(ResForm model) throws Exception {

// TODO Auto-generated method stub

String msg = "";

if (!StringUtils.isNullOrBank(model.getSpId())) {

String type = model.getSaveType();

if (Constant.DELETE.equals(type)) {

dao.delete(model);

msg = "删除成功!";

} else if (Constant.MODUFY.equals(type)) {

dao.modify(model);

msg = "修改成功!";

} else {

throw new UserException("错误,错误的操作类型! ");

}

} else {

dao.save(model);

msg = "保存成功!";

}

?

sendMsg(msg);

}

? ? ?。。。。。。。。。。。。。。。。。

?

保存方法执行后,配置挂钩方法为executeAfter程序。

?

那么在执行完成保存后,挂钩方法同时也会被执行,并且是通过配置实现,你可以完全独立开一个模块来写HOOK程序,然后注入到业务方法中执行。

?

?

?

?

?

?

热点排行