byte-buddy - 字节伙伴拦截器/通知之间的类共享
问题描述
我正在尝试通过我的 java 应用程序中的所有外部调用传递监视/跟踪信息。为了使其透明,我正在尝试使用 byte-buddy,但在使其正常工作时遇到了一些麻烦。
为了跟踪每个传入的 (http) 请求,我拦截HttpServlet.service()
,从中提取令牌标头,HttpServletRequest
并将其放在名为 的静态ThreadLocal
类中TokenHolder
。
为了跟踪每个传出 (http) 请求,我截取HttpURLConnection
并添加了从同一个ThreadLocal
( TokenHolder
) 获得的令牌标头。
我遇到的问题是,它TokenHolder
似乎被初始化了两次,而我的 2 个拦截器没有写入/读取相同的内容ThreadLocal
,我找不到办法。
我想问题在于它HttpURLConnection
存在于引导类路径中,而 servlet API 则没有。
奖励问题:是否可以拦截URL.openConnection()
?这是我的第一个想法,但我永远无法做到,因为我认为URL
类是在代理之前加载的(因为URLClassLoader
),但我不知道是否有解决方法。
解决方案
是的,您可以注册一个RedefinitionStrategy
Byte Buddy 转换先前加载的类的位置。为此,您确实需要避免添加方法或字段。这通常可以通过Advice
仅使用来完成。
你也是对的,类需要存在于引导加载程序上。您可以通过将类放入 jar 并使用接口中指定的方法将类注入引导加载程序Instrumentation
。
推荐阅读
- swift - ObjectMapper 无法序列化响应。来自使用 AlamofireObjectMapper 的 API 响应
- php - 从数组 PHP 中提取数据
- three.js - Cannon.js - 如何防止抖动/抖动块?
- node.js - 403 禁止 + Nginx + 虚拟主机配置 + NodeJS
- java - 正则表达式提取字符的第一次和最后一次出现之间的字符串
- javascript - PhantomJS 返回错误的文本
- python-3.x - 基于比较从另一个嵌套列表中获得的值从嵌套列表中删除项目
- spring - 如何在spring数据中指定javax.persistence.lock.scope
- wordpress - 如何更改撇号主题的帖子标题:Wordpress
- angular - 星云授权问题(总是成功登录) - ngx-admin