首页 > 解决方案 > 字节伙伴拦截器/通知之间的类共享

问题描述

我正在尝试通过我的 java 应用程序中的所有外部调用传递监视/跟踪信息。为了使其透明,我正在尝试使用 byte-buddy,但在使其正常工作时遇到了一些麻烦。

为了跟踪每个传入的 (http) 请求,我拦截HttpServlet.service(),从中提取令牌标头,HttpServletRequest并将其放在名为 的静态ThreadLocal类中TokenHolder

为了跟踪每个传出 (http) 请求,我截取HttpURLConnection并添加了从同一个ThreadLocal( TokenHolder) 获得的令牌标头。

我遇到的问题是,它TokenHolder似乎被初始化了两次,而我的 2 个拦截器没有写入/读取相同的内容ThreadLocal,我找不到办法。

我想问题在于它HttpURLConnection存在于引导类路径中,而 servlet API 则没有。

奖励问题:是否可以拦截URL.openConnection()?这是我的第一个想法,但我永远无法做到,因为我认为URL类是在代理之前加载的(因为URLClassLoader),但我不知道是否有解决方法。

标签: byte-buddy

解决方案


是的,您可以注册一个RedefinitionStrategyByte Buddy 转换先前加载的类的位置。为此,您确实需要避免添加方法或字段。这通常可以通过Advice仅使用来完成。

你也是对的,类需要存在于引导加载程序上。您可以通过将类放入 jar 并使用接口中指定的方法将类注入引导加载程序Instrumentation


推荐阅读