7

我们在 Java 应用程序中定义了一个自定义 HTTP 用户代理,其中包含以下内容:

  1. 软件版本
  2. 用户语言
  3. 平台信息(操作系统系列+版本名称)
  4. 爪哇版

我们希望将此用户代理应用于应用程序创建的所有 HTTP 连接,包括我们手动打开的连接,以及 JRE 自动创建的连接,例如当JEditorPane解析 HTML 代码中引用的外部图像时。

为此,我们在应用程序启动时将"http.agent"系统属性设置为点 1/2/3(让JRE 自己添加 Java 版本):

System.setProperty("http.agent", Version.getAgentString());

当我们从 jar 中运行应用程序时,这很有效,而不是从 Java Web Start 中运行。

作为一种解决方法,我们手动将完整的用户代理设置为我们手动创建的连接:

public static HttpURLConnection openHttpConnection(URL httpURL) throws IOException {
    HttpURLConnection connection = (HttpURLConnection) httpURL.openConnection();
    connection.setRequestProperty("User-Agent", Version.getFullAgentString());
    return connection;
}

但这不处理由 JRE 创建连接的情况(JEditorPane 示例)。

在这种情况下我们如何设置用户代理?

我们试图通过在这个例子sun.net.www.protocol.http.HttpURLConnection.userAgent中使用反射来改变 的值,但它不起作用,我们正面临一个.IllegalAccessException

我们也不能在 JNLP 文件中设置 User-Agent,因为无法确定客户端信息(用户语言 + 平台)。

4

1 回答 1

1

您只能从 JNLP 文件设置系统属性,而不是启动的应用程序。有关如何执行此操作的说明,请参阅http://docs.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/syntax.html 。

不幸的是,您感兴趣的数据当时似乎不可用,因此这很可能不会如您所愿。

您可以使用一些较新的代理功能来获取连接,具体取决于您的应用程序。 http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

一个极端的解决方案可能是在您的应用程序中携带您自己的 http 代理,然后告诉您的应用程序使用它,然后代理代码作为唯一知道如何退出的人,以及您添加的标头字段。

于 2013-04-21T19:58:26.683 回答