【问题标题】:How to set default HTTP User Agent from a Java Web Start application?如何从 Java Web Start 应用程序设置默认 HTTP 用户代理?
【发布时间】:2013-04-17 13:26:58
【问题描述】:

我们在 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 示例)。

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

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

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

【问题讨论】:

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


    【解决方案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 代理,然后告诉应用程序使用它,然后代理代码作为唯一知道如何退出的人,并带有您添加的标头字段。

    【讨论】:

    • 我认为 Java 的代理功能对我们来说不是真正的选择,因为我们已经将它们用于代理目的。我怀疑代理两次是个好主意。
    • @DirkStöcker 你的问题和提问者一样吗?
    • 同样的软件,我是维护者 :-)
    • 也许链接到我们的票务系统是个好主意:josm.openstreetmap.de/ticket/8606
    • @DirkStöcker 我仍然认为你需要明确的代码来做你需要的事情。双重代理可能很麻烦,但如果它解决了你的问题呢?
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多