我们在 Java 应用程序中定义了一个自定义 HTTP 用户代理,其中包含以下内容:
- 软件版本
- 用户语言
- 平台信息(操作系统系列+版本名称)
- 爪哇版
我们希望将此用户代理应用于应用程序创建的所有 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,因为无法确定客户端信息(用户语言 + 平台)。