我试图通过我的Java应用程序中的所有外部调用传递监视/跟踪信息。 为了使其透明,我尝试使用字节伙伴,但是在使其工作时遇到了一些麻烦。
要跟踪每个传入的(http)请求,我拦截HttpServlet.service()
,从HttpServletRequest
中提取令牌标头,并将其放在名为{{1}的类中的静态ThreadLocal
中}。
要跟踪每个传出(http)请求,我拦截TokenHolder
并添加从同一HttpURLConnection
(ThreadLocal
)获得的令牌标头。
我遇到的问题是TokenHolder
似乎被初始化了两次,而我的2个拦截器没有从同一个TokenHolder
进行写入/读取操作,我找不到解决方法
我想问题是ThreadLocal
位于引导类路径中,而servlet API不存在。
奖金问题:是否可以拦截HttpURLConnection
?那是我的第一个主意,但是我永远做不到,因为我想URL.openConnection()
类是在代理之前加载的(由于URL
),但是我不知道是否有解决方法。>
答案 0 :(得分:0)
是的,您可以注册一个RedefinitionStrategy
,其中Byte Buddy可以转换以前加载的类。为此,您确实需要避免添加方法或字段。通常只能通过使用Advice
来完成此操作。
您也很对,类需要存在于引导加载程序中。您可以通过将类放置在jar中并在Instrumentation
界面中使用指定的方法将类注入到引导加载程序中。