在上一篇文章里提到了可以让 DWR自动往Service里面注入一个与Servlet相关的对象
作为参数
只是这样
要每个Service都加上这样的一个参数
奇丑无比!想了 想
决定就让DWR污染一下
Service保留原样
只是增加一个MethodBeforeAdvice(正是它让DWR的API污染了一下
)
来对 Service的方法进行拦截
可以在Service的调用之前对操作进行所谓的身份验证
授权之类的操作
完整的拦截模块几个类文件加个Spring配 置文件搞定
实现拦截功能的类有
一MainInteceptor主拦截器所以DWR的远程调用都会被拦截当然 调用是细到方法级的可配置的该类实现了Spring AOP的MethodBeforeAdvice接口该类有一个集合成员变量成员为IInteceptor
二IInteceptor是一个接口仅有一个execute(AopContext context)函数该接口是拦截器(与前面的主拦截器不同本接口定义的拦截器是可以由用户去实现并且可以有多个)实现接口只需要实现方法这些 拦截器会被主拦截器回调 比如要实现一个身份验证的拦截SecuityInteceptor在配置文件中把这个拦截器设置为主拦截器的属性即可获得回调
三AopContextAop上下文在主拦截器调用IInteceptor的对象时把这个上下文对象作为参数来调用子拦截器从该上下文可获得一系列信息如HttpSessionHttpRequest等甚至你可以自已设置属性
下面看一些代码片断:
MainInteceptor:
private List<IInterceptor> interceptors;//定义一系列的子拦截器
public void setInterceptors(List<IInterceptor> interceptors) {
thisinterceptors = interceptors;
}
在before(Method method Object[] params Object target)方法里
WebContext ctx = WebContextFactoryget();//唯一被DWR污染的地方
HttpSession session = ctxgetSession();
AopContext context = new AopContext(); contextsetSession(session);
for(Iterator it = erator(); ithasNext();){
IInterceptor interceptor = (IInterceptor) itnext();
interceptorexecute(context);
}
IInterceptor
public interface IInterceptor {
public void execute(AopContext context);
}
AopContext就不必贴出来了 随自已定义些什么属性不过就内置了一个Map用来保存数据罢了
下面来看看配置文件
<beans>
<!将要暴露给DWR的Service>
<bean id=bookManager class=orgspringframeworkaopframeworkProxyFactoryBean>
<property name=proxyInterfaces>
<value>netjfajaxbusinessBookManager</value>
</property>
<property name=target>
<ref local=bookManagerImpl/>
</property>
<property name=interceptorNames>
<list>
<value>dwrAdvisor</value>
</list>
</property>
</bean>
<bean id=bookManagerImpl class=netjfajaxbusinessimplBookManagerImpl/>
<!装配器?如果看不懂先看看Spring的Aop吧 P>
<bean id=dwrAdvisor class=orgspringframeworkaopsupportRegexpMethodPointcutAdvisor>
<property name=advice>
<ref local=dwrInterceptor/>
</property>
<property name=patterns>
<list>
<value>**</value>
</list>
</property>
</bean>
<!主拦截器给它设置子拦截器>
<bean id=dwrInterceptor class=erceptorMainInterceptor>
<property name=interceptors>
<list>
<ref bean=test/>
</list>
</property>
</bean>
<!其中一个子拦截器的实现>
<bean id=test class=erceptorTestInterceptor/>
</beans>
就 这样在配置DWR的配置文件时配置<creator>时使用Spring的Creator就可以直接使用上面的Service了当 DWR远程请求时在配置范围内的方法的调用都会被主拦截器拦截并且遍历执行所有子拦截器原有的Service不需要改动只需要多加一个 Spring的配置文件将原有的Service再加一层Aop的轻纱
这是一种实现方法如果有别的方法让DWR更安全有效请一定告知)