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

标签 java http user-agent java-web-start

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

  1. 软件版本
  2. 用户语言
  3. 平台信息(操作系统系列+版本名称)
  4. 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 示例)创建的情况。

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

我们试图通过使用反射来更改sun.net.www.protocol.http.HttpURLConnection.userAgent 的值with this example , 但它不起作用,我们遇到了 IllegalAccessException

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

最佳答案

您只能从 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 代理,然后告诉您的应用程序使用它,代理代码然后作为唯一知道如何退出的代理代码,以及您添加的 header 字段。

关于java - 如何从 Java Web Start 应用程序设置默认 HTTP 用户代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16061336/

相关文章:

json - 如何在 iOS5 中将 JSON 数据对象发布到服务器?

javascript - 为什么跨域简单 POST 请求不会触发预检?

swift - 快速解析用户代理

android - 查找适用于 Android 和/或 iOS 的 native Youtube 应用程序的用户代理

javascript - 使用 JavaScript 检测非移动设备

java - 在java中执行git blame命令

java - 如何在对象声明中初始化 arrayList<Integer>

java - Jeta:如何创建自定义注释处理器

java - 德语和西类牙语文本处理工具

java - Java 中的 HTTP 编程?