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

标签 : github


线上后门与接口调试:

原先需要测试一个接口(如Dubbo、DAO), 或为线上留后门, 需要写大量的Web层(Api、Servlet或Controller)代码并在浏览器触发, 进而调用到实际想要执行的方法或想查看的属性, 而有了Touch后, 你可以专注于业务功能的实现, 而不需要再书写这些跟业务无关的触发代码.

版本历史


0.0 版本

  • Touch的第一个发布版本

    • 接口映射最核心功能
    • 基于Web.xml的配置: 类扫描Touch
    • @TouchtouchPattern属性提供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 同名touchPattern bug;

接下来到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做一层包装.


参考

Touch 方法&属性 映射工具的更多相关文章

  1. Dozer-对象属性映射工具类

    Dozer-对象属性映射工具类 工具类代码: import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; impo ...

  2. 推荐一个 Java 实体映射工具 MapStruct

    声明: 1.DO(业务实体对象),DTO(数据传输对象). 2.我的代码中用到了 Lombok ,不了解的可以自行了解一下,了解的忽略这条就好. 在一个成熟的工程中,尤其是现在的分布式系统中,应用与应 ...

  3. .NET的DTO映射工具AutoMapper

    .NET的DTO映射工具AutoMapper 原文:https://github.com/AutoMapper/AutoMapper/wiki/Getting-started 参考:http://ww ...

  4. 对象属性拷贝工具类大全==>Bean的属性拷贝从此不用愁

    大家在做java开发时,肯定会遇到api层参数对象传递给服务层,或者把service层的对象传递给dao层,他们之间又不是同一个类型对象,但字段又是一样,如果还是用普通的get.set方式来处理话,比 ...

  5. EmitMapper自动映射工具

             在实体与DTO之间,我们一般都需要进行映射.如果手动的来进行转换,实在是太麻烦.所以就产生了很多映射工具,比如AutoMapper,EmitMapper.而经过一些对比,EmitMa ...

  6. 常见Bean映射工具分析评测及Orika介绍

    原地址:http://tech.dianwoda.com/2017/11/04/gao-xing-neng-te-xing-feng-fu-de-beanying-she-gong-ju-orika/ ...

  7. MapStruct 映射工具

    # MapStruct 映射工具  本篇主要讲解MapStruct 一款映射工具,只需简单的定义一个Mapper接口,在编译期间,MapStruct将生成此接口的实现,据说MapStruct性能最高是 ...

  8. Bean映射工具之Apache BeanUtils VS Spring BeanUtils

    背景 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进 ...

  9. Java实体映射工具MapStruct的使用

    官网地址:http://mapstruct.org/ MapStruct 是一个代码生成器,简化了不同的 Java Bean 之间映射的处理,所谓的映射指的就是从一个实体变化成一个实体.例如我们在实际 ...

随机推荐

  1. 搭建ssm项目框架

    [声明]转载注明链接,源码联系公众号:aandb7获取 [此处组织名groupId:com.dayuanit,可替换公司域名:项目名artifactid:...] 此处第二个配置文件选择maven安装 ...

  2. Web SCADA 电力接线图工控组态编辑器

    前言 SVG并非仅仅是一种图像格式, 由于它是一种基于XML的语言,也就意味着它继承了XML的跨平台性和可扩展性,从而在图形可重用性上迈出了一大步.如SVG可以内嵌于其他的XML文档中,而SVG文档中 ...

  3. Vue-cropper 图片裁剪的基本原理

    Vue-cropper 图片裁剪的基本原理 一:裁剪的思路: 1-1,裁剪区域: 需要进行裁剪首先需要形成裁剪区域,裁剪区域的大小和我们的鼠标移动的距离相关联,鼠标移动有多远,裁剪区域就有多大.如下图 ...

  4. python 随笔

    python 学习笔记 运算符重载 PYTHON-进阶-魔术方法小结(方法运算符重载) python有着像C++相似的运算符重载,只需要在类中重写__add__.sub 等方法,就可以直接对对象进行 ...

  5. python3+dlib人脸识别及情绪分析

    一.介绍 我想做的是基于人脸识别的表情(情绪)分析.看到网上也是有很多的开源库提供使用,为开发提供了很大的方便.我选择目前用的比较多的dlib库进行人脸识别与特征标定.使用python也缩短了开发周期 ...

  6. 【BZOJ 2395】Time is money

    题目大意有n个城市(编号从0..n-1),m条公路(双向的),从中选择n-1条边,使得任意的两个城市能够连通,一条边需要的c的费用和t的时间,定义一个方案的权值v=n-1条边的费用和*n-1条边的时间 ...

  7. bzoj3561DZY Loves Math VI

    3561: DZY Loves Math VI Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 503  Solved: 333[Submit][Sta ...

  8. linux 下文件误删恢复

    linux 下文件误删恢复 0x01 事件背景 某天晚上写代码的时候,本来想删除当前目录下一个叫xxx的文件夹 rm -rdf ./xxx/*, 结果光顾着和人说话,一不留神手贱把命令敲成了rm -r ...

  9. C++值传递与引用传递

    值传递:形参是对实参的拷贝,改变形参的值不会改变外部实参的值,从被调用的角度来说,值传递时单向传递(实参->形参),参数的值只能传入,不能传出. 当函数内部需要修改参数,并且不希望这个改变影响调 ...

  10. C语言第二次作业-----顺序结构

    一:改错题 (1)输出指定信息: 将给定源代码输入编译器: 执行编译命令,发现编译器报错,错误信息如下: 经检查,发现源程序将"stdio.h"误拼为"stido.h&q ...