在默认浏览器中打开本地URL时,参数被删除

5
我有以下代码可以打开带参数的本地网页:
String url = "file:///C:/work/my_page.html?";
String params = "message=HelloWorld";

Desktop.getDesktop().browse(new URI(url + params));

但是,当浏览器打开时,参数字符串(?message=HelloWorld)会被移除。

而当我使用 http:// 前缀调用某个页面时,它确实有效。

如何使它也能在本地文件中工作?(即以 file:/// 开头的文件)

2个回答

2
你不能这样做。 http:// 是一种允许参数的协议。 file:// 是另一种不允许参数的协议。
建议是 - 创建本地网站(例如jetty)并仅使用http协议。顺便说一下,所有其他http内容(如AJAX)也将无法工作。

只是一个提示 - 当我手动在浏览器地址栏中添加参数时,它会接受该参数,并且我可以从JS中打印它。因此,也许在从超链接或某些API启动时也可以这样做。 - SomethingSomething
我猜应该有一种解决方法...它可以通过超链接来实现 - 我在同一目录下创建了另一个本地文件,并使用 <a href = 'my_page.html?message=Hello'>点击这里</a>,它确实起作用了。 - SomethingSomething
我在下面发布了我的解决方法,我猜这比启动服务器要少些工作 :) - SomethingSomething

2
我找到了一个解决方法。它利用了从浏览器中可以重定向到具有参数的另一个页面的事实,即使目标页面是本地的。 不要直接从Java中调用URL,而是执行以下操作: 创建一个临时HTML文件。在这个临时文件中,打印一个HTML代码,它将自动重定向浏览器到您想要打开的真实URL。例如:
<meta http-equiv="refresh" content="0; url=file:///C:/work/my_page.html?message=helloWorld" />

然后,只需在临时HTML文件上启动浏览器,它将立即重定向您到真实的URL :)


这是一行代码实现它的Java代码:

String url = "file:///C:/work/my_page.html?";
String params = "message=HelloWorld";

Desktop.getDesktop().browse(new URI(createHtmlLauncher(url + params)));

方法createHtmlLauncher()
private String createHtmlLauncher(String targetUrl) throws Exception {          
    String launcherFile = System.getProperty("java.io.tmpdir") + "local_launcher.html";
    File launcherTempFile = new File(launcherFile);         
    PrintWriter writer = null;
    try {
        writer = new PrintWriter(launcherTempFile, "UTF-8");
    } catch (Exception e) {
        throw new Exception("Error opening file for writing: " + launcherTempFile.getAbsolutePath() + " : " + e.getMessage());
    }
    writer.println("<meta http-equiv=\"refresh\" content=\"0; url=" + targetUrl + "\" />");
    writer.close();

    return "file:///" + launcherFile.replace("\\", "/");        
}

请注意,为了避免填充大量临时文件到磁盘中,此代码每次重定向都使用相同的文件。这意味着如果您在没有任何延迟的情况下打开几个页面,可能会出现竞争问题。
解决方案是使用生成的临时文件。缺点是您无法知道何时从磁盘中删除这些文件。如果您不删除它们并且对该功能进行了一些极端使用,则磁盘可能会满。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接