标签 : github
线上后门与接口调试: 原先需要测试一个接口(如Dubbo、DAO), 或为线上留后门, 需要写大量的Web层(Api、Servlet或Controller)代码并在浏览器触发, 进而调用到实际想要执行的方法或想查看的属性, 而有了Touch后, 你可以专注于业务功能的实现, 而不需要再书写这些跟业务无关的触发代码.
Touch的第一个发布版本
接口映射最核心功能
基于Web.xml的配置: 类扫描Touch
<code>@Touch</code>的<code>touchPattern</code>属性提供Touch别名
第一版<code>com.vdian.touch.converter.Converter</code>
<code>@TouchArg</code>注解获取参数泛型类型
增加Switcher接口, 增加线上环境安全校验
Converter 添加@TouchArg参数
增加Converter与Switcher的默认绑定
fix 空QueryString bug
fix 重载函数定位不准 bug
增加包扫描功能, 精简web.xml内关于Touch的配置
增加ZookeeperSwitcher实现, 提供基于ZK集群的Touch安全控制
增加<code>lists.do</code> 接口提供获取touch context内容
fix fastjson循环引用 bug
0.3.0
删除<code>@TouchArg</code>注解, 动态获取泛型参数类型
0.3.1 版本: 提高响应速度的同时降低内存占用
init时缓存方法参数名、参数类型、参数泛型类型, 加速参数映射速度
使用WeakHashMap替换HashMap存储TouchContext, 占用的内存随GC而释放, 再次调用时重新init.
3.2 版本
更新<code>Converter<T></code>接口, 添加<code>Type[] actualTypes</code>参数代表泛型真实类型, 非泛型参数为<code>null</code>;
0.4.0
将<code>@Touch</code>从annotation包内移出, 直接放在<code>com.vdian.touch</code>包下
弃用web.xml配置, 使用Servlet 3.0 api实现<code>OnTouchServlet</code>自动注册(默认拦截<code>/touch/*</code>目录URL).
将配置集中放入touch.xml(classpath下)中, 并新增touch.xsd约束(已经放如touch.jar包内), 书写touch.xml可实现代码提示.
更新<code>TouchSwitcher</code>接口, 添加<code>init(Map<String, String> config)</code>方法, 创建<code>TouchSwitcher</code>实例时调用(且只调用一次), 将在touch.xml <code><switch> <config .../> <switch></code>标签内容传入<code>init()</code>.
更新<code>ZookeeperSwitcher</code>实现, 支持自定义指定ZK集群.
fix Bean被AOP代理后找不到的Bug(但目前还不能支持Bean被JDK的同时对Bean Alias的情况).
fix jaxp-dom读取注释的bug
0.4.1
使用GuavaCache替换WeakHashMap, 使key在不活跃1小时后失效, 解决频繁访问&频繁GC的问题.
fix json字符串无法反序列化为String的问题
fix 应用占用lists.do(打印所有touchPattern)的问题
0.5.0
去掉<code>loadOnStartup</code>, Touch不再随应用启动而初始化, 改为第一次访问时初始化;
将<code>@Touch</code>移植到<code>filed</code>上, 支持成员变量映射(预计12月中旬发布);
fix 同名<code>touchPattern</code> bug;
接下来到2017年不会再有大版本的更新, 而致力于使Touch更加稳定, 提供更高性能, 适用更多项目类型.
注意: touch.xml只需放在项目classpath下即可, Touch会自动去到classpath目录下扫描该文件, 不必被Spring托管.
为想要touch的方法打上<code>@Touch</code>注解, 马上她就属于你啦:

这样, 你就可以愉快的touch一把:
注: - 从0.4版本开始弃用web.xml配置, 启用Servlet 3.0 api, OnTouchServlet自动注册到Servlet容器内. - 从0.2版本开始Touch不再支持on_touch_class配置, 全面换成包扫描packages . - 使用Touch的Servlet自动注册需要在项目中启用Servlet 3.0(web.xml头更新成如下即可, 否则还是需要像以前一样手动注册, 见注释), 且保证项目内Servlet-api已达到3.0及以上版本(Touch的pom已经引入, 但要防止被其他配置冲掉).
<code>@Touch</code>注解内提供了<code>touchPattern</code>参数用于区分重载方法, 但要注意<code>touchPattern</code>要和浏览器内的URI(如前面的<code>constumObject</code>)对应起来.
参数映射
我们默认使用json与方法参数一一映射, 外层json的key为方法参数名.
自定义Converter
<code>Converter</code>大部分情况下是不用配的, Touch默认为我们绑定了很多类型:
String -> 八种Java基础及包装类型
String -> String
String -> Date(“yyyy-MM-DD HH:MM:SS”)
String -> List
String -> Set
String -> Map
Touch开放了<code>TouchSwitcher</code>接口来提高touch接口的安全性:
如果想实现自己的安全过滤规则, 可参考<code>ZookeeperSwitcher</code>(基于Zookeeper).
在浏览器访问:
即可映射&修改&获取属性值.
Touch当前版本获取方法参数名是从JVM的MethodArea用javassist获取, 其性能很难估计, 如果将来我们需要提升性能, 可以添加类似MyBatis的<code>@Param</code>注解, 但这种方式会增加用户使用的负担(毕竟需要多添加一个注解…).
在有了<code>@Param</code>注解后, 就可以可以参考Spring MVC的<code>@RequestParam</code>:
作出更强大的功能(如参数默认值、参数别名、类型校验等).
我们的目标是将Touch做到完善、简洁且高性能, 这样就可以用作一个通用的RPC转HTTP的工具, 我们只需编写业务代码, 把想要开放http调用的方法前添加<code>@Touch</code>注解, 不需再使用Web层代码对Service做一层包装.
Javassist获取字节码代码主要参考一下两篇文章:
<a href="http://lzxz1234.github.io/java/2014/07/25/Get-Method-Parameter-Names-With-Javassist.html">用 Javassist 获取方法参数名</a>
<a href="http://www.cnblogs.com/hucn/p/3636912.html">Java动态编程初探——Javassist</a>
动态获取泛型参数可以参考
<a href="http://blog.csdn.net/zjf280441589/article/details/50453776">Java 反射 (by 翡青)</a>