繁体   English   中英

如何在Java程序中通过java.net.URL类监视打开的URL?

[英]How can I monitor the opened URLs via java.net.URL class in a Java program?

我正在研究一个大的(很多类)java项目,我有它的源代码,但大多数类是通过ClassLoaders动态创建或下载的。 无论如何,我希望能够“覆盖”java.net.URL类,以便我可以追踪打开网址的调用。 我不能使用嗅探器,因为内容是SSL加密的。 我试图扩展java.net.URL,但它不起作用,因为它是一个最后的类。 我还打开了java.net.URL的源代码并修改了它并且可以成功构建它,现在我怎样才能使默认的java类加载器加载我修改过的java.net.URL而不是原始版本? 欢迎任何建议! 提前致谢。

一个选项是使用AspectJ并将扩展代码编织到URL类中而不是扩展它。 这样你就不必修改任何原始资源,你仍然可以“扩展”最终的类。 当然,缺点是,您为项目添加了另一个依赖项。

如果您还没有使用过AOP,可以在我的博客上找到AOP的简短介绍: http//whatiscomingtomyhead.wordpress.com/2010/02/06/aspect-oriented-programming-an-introduction/

正如您所发现的那样,您无法扩展URL。 可能能够让JVM加载您的自定义版本的类,但恕我直言,这听起来像一场噩梦。

值得庆幸的是,您可以实现自定义URLStreamHandlerFactory并通过URL.setURLStreamHandlerFactory()进行注册。 这将允许您在URL打开流时包装和监视,就像您希望的那样。

编辑

但是,如果您的应用已经注册了一个,那么您将无法使用此方法; URLStreamHandlerFactories是1 / app。 许多类型的app容器都使用一个(例如Tomcat),所以如果你使用其中一个就是SOL。

你考虑过使用AspectJ吗? 您可以在URL构造函数上设置切入点,从而通知任何新的URL实例创建。

如果您在标准API中修改了类,则必须在类(jar或目录)之前添加引导类路径,否则VM内部类将优先于添加到普通类路径的任何类。 使用Sun的VM,您可以使用参数-Xbootclasspath / p:来添加优先级高于内部实现的新类。

在不修改URL实现的情况下,另一个选项可能是实现ProxySelector。 打开URLConnection将导致URL实现查询ProxySelector.select(URI uri)以获取给定地址的合适代理。 如果您实际使用代理,这甚至可以工作。 在注册自己的实现之前,可以使用ProxySelector.getDefault()获取系统ProxySelector,并在跟踪传递给select方法的URI后将select调用委托给原始实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM