日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Touch 方法属性 映射工具

發布時間:2025/3/17 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Touch 方法属性 映射工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

標簽 : github


線上后門與接口調試:
原先需要測試一個接口(如Dubbo、DAO), 或為線上留后門, 需要寫大量的Web層(Api、Servlet或Controller)代碼并在瀏覽器觸發, 進而調用到實際想要執行的方法或想查看的屬性, 而有了Touch后, 你可以專注于業務功能的實現, 而不需要再書寫這些跟業務無關的觸發代碼.

  • project: https://github.com/feiqing/touch
  • git: https://github.com/feiqing/touch.git

版本歷史


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 同名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/touchhttp://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/javaeehttp://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 {@Touchprivate String p1;@Touchprivate Date p2;@Touchprivate Map<String, Object> p3;@Touchprivate Set<String> p4;@Touchprivate int p5;@Touchprivate char p6;@Touchprivate User user;@Touchprivate 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獲取字節碼代碼主要參考一下兩篇文章:
    • 用 Javassist 獲取方法參數名
    • Java動態編程初探——Javassist
  • 動態獲取泛型參數可以參考
    • Java 反射 (by 翡青)
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的Touch 方法属性 映射工具的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。