天天看点

Touch 方法&属性 映射工具Touch 方法&属性 映射工具(0.5 版本)

标签 : 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&lt;T&gt;</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&lt;String, String&gt; config)</code>方法, 创建<code>TouchSwitcher</code>实例时调用(且只调用一次), 将在touch.xml <code>&lt;switch&gt; &lt;config .../&gt; &lt;switch&gt;</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小时后失效, 解决频繁访问&amp;频繁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 方法&amp;amp;属性 映射工具Touch 方法&amp;属性 映射工具(0.5 版本)

这样, 你就可以愉快的touch一把:

Touch 方法&amp;amp;属性 映射工具Touch 方法&amp;属性 映射工具(0.5 版本)
注: - 从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 -&gt; 八种Java基础及包装类型

String -&gt; String

String -&gt; Date(“yyyy-MM-DD HH:MM:SS”)

String -&gt; List

String -&gt; Set

String -&gt; Map

Touch开放了<code>TouchSwitcher</code>接口来提高touch接口的安全性:

如果想实现自己的安全过滤规则, 可参考<code>ZookeeperSwitcher</code>(基于Zookeeper).

在浏览器访问:

即可映射&amp;修改&amp;获取属性值.

Touch当前版本获取方法参数名是从JVM的MethodArea用javassist获取, 其性能很难估计, 如果将来我们需要提升性能, 可以添加类似MyBatis的<code>@Param</code>注解, 但这种方式会增加用户使用的负担(毕竟需要多添加一个注解…).

在有了<code>@Param</code>注解后, 就可以可以参考Spring MVC的<code>@RequestParam</code>:

Touch 方法&amp;amp;属性 映射工具Touch 方法&amp;属性 映射工具(0.5 版本)

作出更强大的功能(如参数默认值、参数别名、类型校验等).

我们的目标是将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>