【发布时间】:2013-04-17 13:26:58
【问题描述】:
我们在 Java 应用程序中定义了一个自定义 HTTP 用户代理,其中包含以下内容:
- 软件版本
- 用户语言
- 平台信息(操作系统系列 + 版本名称)
- Java 版本
我们希望将此用户代理应用于应用程序创建的所有 HTTP 连接,包括我们手动打开的连接,以及 JRE 自动创建的连接,例如当JEditorPane 解析 HTML 代码中引用的外部图像时。
为此,我们在应用程序启动时将"http.agent" 系统属性设置为点1/2/3(让JRE add by itself the Java version):
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 示例)。
在这种情况下我们如何设置用户代理?
我们尝试通过使用反射with this example 来更改sun.net.www.protocol.http.HttpURLConnection.userAgent 的值,但它不起作用,我们正面临IllegalAccessException。
我们无法在 JNLP 文件中设置 User-Agent,因为无法确定客户端信息(用户语言 + 平台)。
【问题讨论】:
标签: java http user-agent java-web-start