Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在默认浏览器中打开本地URL时,将删除参数_Java - Fatal编程技术网

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

Java 在默认浏览器中打开本地URL时,将删除参数,java,Java,我使用以下代码打开带有参数的本地网页: String url = "file:///C:/work/my_page.html?"; String params = "message=HelloWorld"; Desktop.getDesktop().browse(new URI(url + params)); 但是,当浏览器打开时,参数字符串(?message=HelloWorld)将被删除 当我使用http://前缀调用某个页面时,它确实起作用 如何使其也适用于本地文件?(即以文件开始:/

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

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

Desktop.getDesktop().browse(new URI(url + params));
但是,当浏览器打开时,参数字符串(
?message=HelloWorld
)将被删除

当我使用
http://
前缀调用某个页面时,它确实起作用

如何使其也适用于本地文件?(即以
文件开始://

您不能。 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" />

方法
createHtmlLauncher()

private String createHtmlLauncher(字符串targetUrl)引发异常{
String launchefile=System.getProperty(“java.io.tmpdir”)+“local_launcher.html”;
File launcherTempFile=新文件(launcherFile);
PrintWriter=null;
试一试{
writer=新的PrintWriter(文件“UTF-8”);
}捕获(例外e){
抛出新异常(“打开文件进行写入时出错:“+launcherTempFile.getAbsolutePath()+”:“+e.getMessage()”);
}
writer.println(“”);
writer.close();
返回“file://”+launcherFile.replace(“\\”,“/”);
}
请注意,为了避免用大量临时文件填充磁盘,此代码每次都使用相同的文件进行重定向。这意味着如果你毫不拖延地打开几页,你可能会遇到种族问题


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

请注意-当我在浏览器的地址栏中手动添加参数时,它会接受该参数,我可以从JS打印它。因此,当从超链接或API启动它时,也可能会这样做。我想有一种方法可以解决它。。。它与hyperlink一起工作-我在同一目录中创建了另一个本地文件并使用了
,它确实起了作用。我在下面发布了我的解决方法,我想这比启动服务器要简单:)
String url = "file:///C:/work/my_page.html?";
String params = "message=HelloWorld";

Desktop.getDesktop().browse(new URI(createHtmlLauncher(url + params)));
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("\\", "/");        
}