Touch 方法&属性 映射工具
Touch 方法&属性 映射工具(0.5 版本)
标签 : github
线上后门与接口调试:
原先需要测试一个接口(如Dubbo、DAO), 或为线上留后门, 需要写大量的Web层(Api、Servlet或Controller)代码并在浏览器触发, 进而调用到实际想要执行的方法或想查看的属性, 而有了Touch后, 你可以专注于业务功能的实现, 而不需要再书写这些跟业务无关的触发代码.
版本历史
0.0 版本
- Touch的第一个发布版本
- 接口映射最核心功能
- 基于Web.xml的配置: 类扫描Touch
@Touch的touchPattern属性提供Touch别名- 第一版
com.vdian.touch.converter.Converter @TouchArg注解获取参数泛型类型
0.1版本
- 增加Switcher接口, 增加线上环境安全校验
- Converter 添加@TouchArg参数
- 增加Converter与Switcher的默认绑定
- fix 空QueryString bug
- fix 重载函数定位不准 bug
0.2版本
- 增加包扫描功能, 精简web.xml内关于Touch的配置
- 增加ZookeeperSwitcher实现, 提供基于ZK集群的Touch安全控制
- 增加
lists.do接口提供获取touch context内容 - fix fastjson循环引用 bug
0.3版本
- 0.3.0
删除@TouchArg注解, 动态获取泛型参数类型 - 0.3.1 版本: 提高响应速度的同时降低内存占用
- init时缓存方法参数名、参数类型、参数泛型类型, 加速参数映射速度
- 使用WeakHashMap替换HashMap存储TouchContext, 占用的内存随GC而释放, 再次调用时重新init.
- 3.2 版本
更新Converter<T>接口, 添加Type[] actualTypes参数代表泛型真实类型, 非泛型参数为null;
0.4版本
- 0.4.0
- 将
@Touch从annotation包内移出, 直接放在com.vdian.touch包下 - 弃用web.xml配置, 使用Servlet 3.0 api实现
OnTouchServlet自动注册(默认拦截/touch/*目录URL). - 将配置集中放入touch.xml(classpath下)中, 并新增touch.xsd约束(已经放如touch.jar包内), 书写touch.xml可实现代码提示.
- 更新
TouchSwitcher接口, 添加init(Map<String, String> config)方法, 创建TouchSwitcher实例时调用(且只调用一次), 将在touch.xml<switch> <config .../> <switch>标签内容传入init(). - 更新
ZookeeperSwitcher实现, 支持自定义指定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.5.0
- 去掉
loadOnStartup, Touch不再随应用启动而初始化, 改为第一次访问时初始化; - 将
@Touch移植到filed上, 支持成员变量映射(预计12月中旬发布); - fix 同名
touchPatternbug;
- 去掉
接下来到2017年不会再有大版本的更新, 而致力于使Touch更加稳定, 提供更高性能, 适用更多项目类型.
入门
1. pom
<dependency>
<groupId>com.vdian.touch</groupId>
<artifactId>touch</artifactId>
<version>0.5.0-SNAPSHOT</version>
</dependency>
2. touch.xml(maven项目需要放在resource目录下)
<?xml version="1.0" encoding="utf-8"?>
<touch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.vdian.net/touch"
xsi:schemaLocation="http://www.vdian.net/touch
http://www.vdian.net/touch.xsd">
<packages>
<!-- package最少有一个(可以多个), 否则touch.xsd验证不通过, 且启动时会抛异常 -->
<package>com.vdian.demo</package>
</packages>
<converters>
<!-- 默认已经注册了下面三个Converter, 如果没有自定义的Converter可以去掉这整个 converters 的配置 -->
<converter>com.vdian.touch.converter.CalendarConverter</converter>
<converter>com.vdian.touch.converter.DateConverter</converter>
<converter>com.vdian.touch.converter.SetConverter</converter>
</converters>
<switchers>
<!-- 默认没有注册任何Switcher, 如果需要使用ZookeeperSwitcher, 需要在项目pom中添加curator-recipes的依赖, 该依赖默认在Touch中是optional的 -->
<switcher class="com.vdian.touch.switcher.ZookeeperSwitcher">
<config key="zookeeper" value="zookeeper.address:2181"/>
<config key="touchPath" value="/touch/touch-switcher"/>
<config key="touchKey" value="touch_open"/>
</switcher>
</switchers>
</touch>
注意: touch.xml只需放在项目classpath下即可, Touch会自动去到classpath目录下扫描该文件, 不必被Spring托管.
3. @Touch
为想要touch的方法打上@Touch注解, 马上她就属于你啦:

4. 浏览器输入
http://localhost:8080/touch/
constumObject? // 方法名
{
"user": { // 方法参数名
"name": "feiqing", // 方法参数值
"age": 18
},
"date": "1992-03-20 01:01:01",
"users": [{
"name": "feiqing",
"age": 18
},
{
"name": "feiqing2",
"age": 98
}]
}
这样, 你就可以愉快的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已经引入, 但要防止被其他配置冲掉).
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
metadata-complete="false">
<!-- Servlet 2.0 配置
<servlet>
<servlet-name>OnTouchServlet</servlet-name>
<servlet-class>com.vdian.touch.server.OnTouchServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>OnTouchServlet</servlet-name>
<url-pattern>/touch/*</url-pattern>
</servlet-mapping>
-->
</web-app>
进阶
1. 同名方法
@Touch注解内提供了touchPattern参数用于区分重载方法, 但要注意touchPattern要和浏览器内的URI(如前面的constumObject)对应起来.
2. Converter与参数映射
参数映射
我们默认使用json与方法参数一一映射, 外层json的key为方法参数名.自定义Converter
Converter大部分情况下是不用配的, Touch默认为我们绑定了很多类型:- String -> 八种Java基础及包装类型
- String -> String
- String -> Date(“yyyy-MM-DD HH:MM:SS”)
- String -> List
- String -> Set
- String -> Map
3. Switcher与安全性
Touch开放了TouchSwitcher接口来提高touch接口的安全性:
public interface TouchSwitcher {
/**
* init when new TouchSwitcher instance.
*
* @param config in touch.xml <switcher><config ... /> ...</switcher>
*/
void init(Map<String, String> config);
boolean isSwitchOn(String touchPattern, String queryString);
}
如果想实现自己的安全过滤规则, 可参考ZookeeperSwitcher(基于Zookeeper).
属性映射(0.5 版本新功能)
@Component
public class TouchTestCaseImpl implements TouchTestCase {
@Touch
private String p1;
@Touch
private Date p2;
@Touch
private Map<String, Object> p3;
@Touch
private Set<String> p4;
@Touch
private int p5;
@Touch
private char p6;
@Touch
private User user;
@Touch
private List<User> users;
// ...
}
在浏览器访问:
http://localhost:8080/touch/p1?string
http://localhost:8080/touch/p2?2012-01-05 12:30:30
http://localhost:8080/touch/p3?{"key1":"value1", "key2", 2}
http://localhost:8080/touch/p4?["set1", "set2"]
http://localhost:8080/touch/p5?88
http://localhost:8080/touch/p6?A
http://localhost:8080/touch/user?{"name":"jifang", "age":8}
http://localhost:8080/touch/users?[{"name":"jifang", "age":8},{"name":"jifang2", "age":18}]
即可映射&修改&获取属性值.
未来规划
1. 方法参数名
Touch当前版本获取方法参数名是从JVM的MethodArea用javassist获取, 其性能很难估计, 如果将来我们需要提升性能, 可以添加类似MyBatis的@Param注解, 但这种方式会增加用户使用的负担(毕竟需要多添加一个注解…).
2. 方法参数映射功能增强
在有了@Param注解后, 就可以可以参考Spring MVC的@RequestParam:
作出更强大的功能(如参数默认值、参数别名、类型校验等).
3. RPC(如Dubbo)转HTTP
我们的目标是将Touch做到完善、简洁且高性能, 这样就可以用作一个通用的RPC转HTTP的工具, 我们只需编写业务代码, 把想要开放http调用的方法前添加@Touch注解, 不需再使用Web层代码对Service做一层包装.
参考
- Javassist获取字节码代码主要参考一下两篇文章:
- 动态获取泛型参数可以参考
Touch 方法&属性 映射工具的更多相关文章
- Dozer-对象属性映射工具类
Dozer-对象属性映射工具类 工具类代码: import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; impo ...
- 推荐一个 Java 实体映射工具 MapStruct
声明: 1.DO(业务实体对象),DTO(数据传输对象). 2.我的代码中用到了 Lombok ,不了解的可以自行了解一下,了解的忽略这条就好. 在一个成熟的工程中,尤其是现在的分布式系统中,应用与应 ...
- .NET的DTO映射工具AutoMapper
.NET的DTO映射工具AutoMapper 原文:https://github.com/AutoMapper/AutoMapper/wiki/Getting-started 参考:http://ww ...
- 对象属性拷贝工具类大全==>Bean的属性拷贝从此不用愁
大家在做java开发时,肯定会遇到api层参数对象传递给服务层,或者把service层的对象传递给dao层,他们之间又不是同一个类型对象,但字段又是一样,如果还是用普通的get.set方式来处理话,比 ...
- EmitMapper自动映射工具
在实体与DTO之间,我们一般都需要进行映射.如果手动的来进行转换,实在是太麻烦.所以就产生了很多映射工具,比如AutoMapper,EmitMapper.而经过一些对比,EmitMa ...
- 常见Bean映射工具分析评测及Orika介绍
原地址:http://tech.dianwoda.com/2017/11/04/gao-xing-neng-te-xing-feng-fu-de-beanying-she-gong-ju-orika/ ...
- MapStruct 映射工具
# MapStruct 映射工具 本篇主要讲解MapStruct 一款映射工具,只需简单的定义一个Mapper接口,在编译期间,MapStruct将生成此接口的实现,据说MapStruct性能最高是 ...
- Bean映射工具之Apache BeanUtils VS Spring BeanUtils
背景 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进 ...
- Java实体映射工具MapStruct的使用
官网地址:http://mapstruct.org/ MapStruct 是一个代码生成器,简化了不同的 Java Bean 之间映射的处理,所谓的映射指的就是从一个实体变化成一个实体.例如我们在实际 ...
随机推荐
- 1.7 理解dropout
Dropout为什么有正则化的作用? 下面来直观理解一下. 上面讲到,dropout每次迭代都会让一部分神经元失活,这样使得神经网络会比原始的神经网络规模变小,因此采用一个较小神经网络好像和使用正则化 ...
- 卷积神经网络(CNN)中卷积的实现
卷积运算本质上就是在滤波器和输入数据的局部区域间做点积,最直观明了的方法就是用滑窗的方式,c++简单实现如下: 输入:imput[IC][IH][IW] IC = input.channels IH ...
- hive-jdbc获取查询日志慢的问题发现与解决
1.问题描述: 数据平台的临时查询一直有一个问题,就是日志获取太慢了,每次都是和结果一块出来的,这就非常影响用户的体验,半天都没任何输出.另一个是Beeline客户端不一致,beeline客户端每次都 ...
- TP-LINK | TL-WR842N设置无线转有线
首先点击右上角的"高级设置". 点击左侧的"无线设置"栏,点击"WDS无线桥接",然后一步步设置可以使路由器连接到当前的一个无线网络. 然后 ...
- JavaScript 散集合(HashArray)
散列表和散列映射是一样的,我们已经在本章中介绍了这种数据结构. 在一些编程语言中,还有一种叫作散列集合的实现.散列集合由一个集合构成,但是插入. 移除或获取元素时,使用的是散列函数.我们可以重用本章中 ...
- [LeetCode] Longest Harmonious Subsequence 最长和谐子序列
We define a harmonious array is an array where the difference between its maximum value and its mini ...
- css 宽高自适应的div 元素 如何居中 垂直居中
在我们 编写css 样式的时候经常会遇见一个问题 那就是一个 宽高未知的元素 要让他 垂直居中如何实现这个呢 下面是我常用的两种方法 上代码 下面的是 结构代码 <div class=" ...
- 做了两年多salesforce平台开发,转Java的经历
2015年毕业,转眼已经三年多了.三年对于现在的我,真的很快,一开始对软件开发的执着一直没有变.我是一个很普通很普通长沙的一个专科毕业.刚进大学,对于软件开发真的是小白,仅仅只是存在对于游戏,和桌面软 ...
- ios开发-指纹识别
最近我们使用支付宝怎么软件的时候,发现可以使用指纹了,看起来是否的高大上.当时苹果推出了相关接口,让程序写起来很简单哈. 在iPhone5s的时候,苹果推出了指纹解锁.但是在ios8.0的时候苹果才推 ...
- [HNOI 2015]亚瑟王
Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...