如何从Java Web Start应用程序设置默认HTTP用户代理?

vip*_*vip 7 java user-agent http java-web-start

我们在Java应用程序中定义了一个包含以下内容的自定义HTTP User-Agent:

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

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

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

System.setProperty("http.agent", Version.getAgentString());
Run Code Online (Sandbox Code Playgroud)

当我们从jar运行应用程序时,这很有用,但不是从Java Web Start运行.

作为解决方法,我们手动将完整的User-Agent设置为我们手动创建的连接:

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

但这并不能处理JRE(JEditorPane示例)创建连接的情况.

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

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

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

Tho*_*sen 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 代理,然后告诉您的应用程序使用该代理代码,然后代理代码作为唯一知道如何退出的代理代码,以及您添加的标头字段。