ROP的服务类通过@ServiceMethodBean进行注解,服务方法通过@ServiceMethod标注,ROP在启动时自动扫描Spring容器中的Bean,将服务方法写到服务注册表中.
最近发现了一个问题,是由于Java泛型的桥方法和合成方法引起的,下面举例说明:
package com.rop.session;
/**
* 其中T是登录请求的类,而R是注销请求的类
* @author : chenxh
* @date: 13-10-16
*/
import com.rop.RopRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.UUID;
public abstract class AuthenticationService<T extends RopRequest,R extends RopRequest> {
...
public abstract Object logon(T logonRequest);
/**
* 该方法在子类在实现,并打上@ServiceMethod注解,作为注销的服务方法
* @param loginRequest
* @return
*/
public abstract Object logout(R logoutRequest);
}
AuthenticationService定义了两个抽象方法,需要子类实现,以便实现登录认证.
子类实现如下:
@ServiceMethodBean
public class AppAuthenticationService extends AuthenticationService<LogonRequest,LogoutRequest> {
public static final String USER_LOGON = "user.logon";
public static final String USER_LOGOUT = "user.logout";
...
@ServiceMethod(method = USER_LOGON, version = "1.0",
needInSession = NeedInSessionType.NO,ignoreSign = IgnoreSignType.YES)
@Override
public Object logon(LogonRequest logonRequest) {
...
}
@ServiceMethod(method = USER_LOGOUT, version = "1.0")
@Override
public Object logout(LogoutRequest logoutRequest) {
...
}
}
AppAuthenticationService类中覆盖了抽象父类中的方法,并且对泛型进行了具化.
但是当ROP扫描服务方法时,服务方法的入参识别发生了错误,错将入参识别为RopRequest,而非
LogonRequest,LogoutRequest.
断点跟踪到注册服务方法时,发现AuthenticationService类居然有2个logon和2个logout方法:
1.logon(LogonRequest r)
2.logout(LogoutRequest r)
3.logon(RopRequest r)
4.logout(RopRequest r)
其中前两个方法是AuthenticationService中定义的方法,而后两个方法是为了实现泛型具化JAVA自动生产的方法,称为桥方法,可参见这篇文章的说明:
http://jiangshuiy.iteye.com/blog/1339105
后两个方法也有和前两个方法一样的@ServiceMethod注解,因此在ROP扫描时,就可以扫描到桥方法,而把真正的方法覆盖了.
JAVA的Method反射类中拥有判断是否是桥方法的方法:
Method#isBridge()
前两个方法返回的是false,而后两个方法返回的是true.
另外,桥方法也是合成方法(Synthetic),Method反射类中拥有判断是否是桥方法的方法:
Method#isSynthetic()
关于合成方法,亦请参考
http://jiangshuiy.iteye.com/blog/1339105
为了避免ROP扫描到这些杂攻杂八的方法,因此ROP扫描程序做了以下的调整:
private void registerFromContext(final ApplicationContext context) throws BeansException {
if (logger.isDebugEnabled()) {
logger.debug("对Spring上下文中的Bean进行扫描,查找ROP服务方法: " + context);
}
String[] beanNames = context.getBeanNamesForType(Object.class);
for (final String beanName : beanNames) {
Class<?> handlerType = context.getType(beanName);
//1只对标注 ServiceMethodBean的Bean进行扫描
if(AnnotationUtils.findAnnotation(handlerType,ServiceMethodBean.class) != null){
ReflectionUtils.doWithMethods(handlerType, new ReflectionUtils.MethodCallback() {
public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
ReflectionUtils.makeAccessible(method);
... }
},
new ReflectionUtils.MethodFilter() {
public boolean matches(Method method) {
//2不是合成方法,且标注了ServiceMethod的方法!!
return !method.isSynthetic() && AnnotationUtils.findAnnotation(method, ServiceMethod.class) != null;
}
}
);
}
}
...
}
- 大小: 298.8 KB
分享到:
相关推荐
rop基础
它不同于传统的SOAP Web Service和Rest Web Service这些Web Service 技术型框架,Rop是一个应用型的Web Service平台框架,它不但可以方便快捷地开发一个个Web Service服务,还提供了服务平台领域问题的整体解决方案...
pwn学习资料整理——ROP技术(pwn_rop1)
本文是借助maven搭建的一个rop框架,以及一个简单的测试用例,供大家学习分享。如果发现不对的地方,希望大家留言提出,
RopRop 开发类似于淘宝 开发类似于淘宝 开发类似于淘宝 开发类似于淘宝 服务开放平台 服务开放平台 服务开放平台 这样的服务平台 这样的服务平台 这样的服务平台 这样的服务平台 。RopRopRop充分借鉴了当前大型网站...
rop开放平台s
Rop开发手册,内容详尽,开放平台框架,易使用易扩展
pwn学习资料整理——ROP技术(pwn_rop2)
DefConCTF 2015 Quals CTFPWN ROP练习题 可用于练习基础的ROP
9月25日,SyScan360 2013国际前瞻信息安全会议在北京国家会议中心举行。安全专家Nguyen Anh Quynh同与会者共同探讨《OptiROP:ROP gadgets搜寻神器》这一议题,并现场传授使用OptiROP的方法。
这是https://hackme.inndy.tw/scoreboard/的rop2题目如果网站被墙或者关闭请从这里下载
植物小G蛋白ROP的研究进展,柯丹霞,朱辉,ROP是植物中的Rho家族小鸟嘌呤核苷酸结合蛋白,它们在植物中的信号转导中发挥了至关重要的调节作用。ROP参与到一系列的生理生化过程
hackme.inndy.tw的rop题目,如果那个网站被墙或者关闭的话可以从这里下载
rop编程,E文,但是使用的词汇都是常见的词汇,需要汇编基础。
通过method参数指定具体API服务:如taobao.user.get、taobao.users.get等。相比于http://host/user/tom,TOP使用http://gw.api.tbsandbox.com/router/rest?method=taobao.user.get&userName=tom,乍看起来纯REST简单...
基于ROP的SAMPLE开发代码,属于通信框架的一部分。ROP是淘宝提供的一种开发协议框架,底层基于NETTY。
弓形虫ROP2基因的克隆及原核表达,江涛,周艳琴,应用PCR技术从刚地弓形虫( Toxoplasma gondii )RH株的基因组DNA中扩增编码ROP2(rhpotry protein 2)的部分基因,构建pGEX-KG-ROP2重组表达质粒,经酶切�
鲁棒优化问题(Robust Optimization Problem,ROP)是进化算法(Evolutionary Algorithms,EAs)研究的重要方面之一,对于许多实际工程优化问题,通常需要得到鲁棒最优解。利用多目标优化中的Pareto思想优化ROP的...
x86 simple rop gets