繁体   English   中英

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

[英]Parameters are removed when opening local URL in default browser

我有以下代码用于打开带有参数的本地网页:

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

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

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

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

如何使其与本地文件一起使用? (即以file:///开头)

你不能。 http://是一个允许参数的协议。 file://是另一个不允许参数的协议。

建议是 - 创建本地网站(例如jetty)并仅使用http potocol。 顺便说一下,像AJAX这样的所有其他http内容也无法正常工作。

我找到了解决它的解决方法。 它滥用了这样一个事实:即使目标页面是本地的,也可以通过浏览器重定向到带参数的另一个页面。

而不是直接从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("\\", "/");        
}

请注意,为避免使用大量临时文件填充磁盘,此代码每次都使用相同的文件进行重定向。 这意味着如果你毫不拖延地打开几页,你可能会遇到种族问题。

解决方案是使用生成的临时文件。 它的缺点是您无法知道何时从磁盘中删除这些文件。 如果您不删除它们并且您对该功能有一些极端的使用,则磁盘可能已满。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM