【问题标题】:How to pass URL parameters from Java to local HTML file in Windows 7?如何在 Windows 7 中将 URL 参数从 Java 传递到本地 HTML 文件?
【发布时间】:2011-07-21 09:37:52
【问题描述】:

我迫切需要您的专业知识来解决 Windows-7 问题。

场景:我有一个基于框架的帮助包,用于设置上下文相关的帮助调用。 Java 应用程序能够控制帮助包打开到哪个页面,方法是将代表所需 HTML 命名为锚点的标记传递给名为 pophelp 的 HTML 文件。此文件具有 javascripting,可从 URL 末尾读取传递的标记,并将其映射到帮助包中的相应 HTML 文件并打开它。

问题:上述方案适用于 Windows XP,但不再适用于 Windows 7。

Java 应用的调用机制: rundll32 url.dll,FileProtocolHandler file://filepath/pophelp.html?tag

到目前为止的调查结果总结: 似乎 url.dll 不再允许在 Windows 7 中通过 URL 传递参数。正在剥离参数。我还尝试使用 Java 中的 Desktop.getDesktop().browse() 进行相同类型的调用,但它似乎也剥离了 .html 之后的所有参数。

示例代码:

在 Windows XP 中工作的原始调用 --

运行命令: rundll32 url.dll,FileProtocolHandler file://C:\Program Files\App System\App-Editor-8.0.1\help\pophelp.html?TAG=callsubflow

结果: ?TAG=callsubflow 未通过。

使用 Desktop.getDesktop().browse() 的新代码 --

public static void main(String[] args) {

    String url = "file:///C:/Program Files/App System/App-Editor-8.0.1/help/pophelp.html?TAG=callsubflow";

    try {
        if (Desktop.isDesktopSupported()) {
            Desktop desktop = Desktop.getDesktop();
                  if (desktop.isSupported(Desktop.Action.BROWSE)) {
                      desktop.browse(new URI(url.replace(" ", "%20")));
            }
        }

    } catch (IOException e) {
        System.out.println("Unable to open "+url+": "+e.getMessage());

    } catch (URISyntaxException e) {
        e.printStackTrace();
    }

}

结果: ?TAG=callsubflow 未通过。

任何帮助将不胜感激!

【问题讨论】:

  • BasicService 似乎适用于Google on Java,所以这似乎是本地文件所特有的。在那种情况下,我的 WAG 是某种“安全升级”(尽管不要让我解释它),它已针对本地文件进行了更改。
  • 我也是这么想的,但是当你需要它时,没有解决方法或设置来使它工作,这似乎很疯狂。我不喜欢我的电脑以绝对的方式规定我能做什么和不能做什么。

标签: java html windows-7


【解决方案1】:

我有一个解决方案,不是快速(或漂亮)的解决方案,而是 一个 解决方案:)

rundll32 url.dll,FileProtocolHandler 在使用带有http/s 协议的 URL 时确实会传递参数(尝试使用 rundll32 url.dll,FileProtocolHandler http://www.google.com?q=google),因此您可以设置小型 http 服务器(我猜想像 Jetty)来提供帮助文件并使用

rundll32 url.dll,FileProtocolHandler http://localhost:[helpServerIp]/help/pophelp.html?TAG=callsubflow

【讨论】:

    【解决方案2】:

    我真的不知道为什么 Windows 会删除本地文件上的参数。正如 cmets 中提到的,这似乎是某种奇怪的安全限制。但是我曾经遇到过类似的问题,我也找到了适合这种情况的解决方法。
    只需创建一个本地临时 HTML 文件(不带参数),将您重定向到所需的文件(带参数)。
    看看这两种方法:

    // creates w3c conform redirect HTML page
    public String createRedirectPage(String url){
        return  "<!DOCTYPE HTML>" +
                "<meta charset=\"UTF-8\">" +
                "<meta http-equiv=\"refresh\" content=\"1; url=" + url + "\">" +
                "<script>" +
                "window.location.href = \"" + url + "\"" +
                "</script>" +
                "<title>Page Redirection</title>" +
                "<!-- Note: don't tell people to `click` the link, just tell them that it is a link. -->" +
                "If you are not redirected automatically, follow the <a href='" + url + "'>link</a>";
    }
    
    // creates temporary file with content of redirect HTML page
    public URI createRedirectTempFile(String url) {        
        BufferedWriter writer = null;
        File tmpFile = null;
        try {
            // creates temporary file
            tmpFile = File.createTempFile("pophelp", ".html", null);
            // deletes file when the virtual machine terminate
            tmpFile.deleteOnExit(); 
            // writes redirect page content to file 
            writer = new BufferedWriter(new FileWriter(tmpFile));
            writer.write(createRedirectPage(url));
            writer.close();
        }
        catch (IOException e) {
            return null;
        }
        return tmpFile.toURI();
    }
    

    现在你可以像这样使用这些:

    String url = "file:///C:/Program Files/App System/App-Editor-8.0.1/help/pophelp.html?TAG=callsubflow";
    
    if (Desktop.isDesktopSupported()) {
        Desktop desktop = Desktop.getDesktop();
        if (desktop.isSupported(Desktop.Action.BROWSE)) {
            desktop.browse(createRedirectTempFile(url.replace(" ", "%20")));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 2018-05-30
      • 1970-01-01
      • 2018-04-28
      相关资源
      最近更新 更多