Как передать параметры URL из Java в локальный файл HTML в Windows 7? - PullRequest
5 голосов
/ 23 марта 2011

Мне крайне необходим ваш опыт в решении проблемы Windows-7.

Сценарий: У меня есть пакет справки на основе фреймов, настроенный для контекстно-зависимых вызовов справки.Приложение Java может контролировать, с какой страницы открываются пакеты справки, передавая тег, представляющий нужный HTML-код с привязкой, в файл HTML с именем pophelp.Этот файл имеет javascripting, который считывает переданный тег с конца URL-адреса и сопоставляет его с соответствующим HTML-файлом в пакете справки и открывает его.

Проблема: Приведенный выше сценарий работает вWindows XP, но больше не в Windows 7.

Механизм вызова из приложения Java: rundll32 url.dll, файл FileProtocolHandler: //filepath/pophelp.html? Tag

Сводка результатов на данный момент: Похоже, что url.dll больше не позволяет передавать параметры с URL-адресами в Windows 7. Параметры удаляются.Я также пытался выполнить тот же тип вызова, используя Desktop.getDesktop (). Browse () из Java, но, похоже, он отбрасывает все параметры после .html.

Пример кода:

Исходный вызов, работающий в Windows XP -

Выполнение команды: rundll32 url.dll, файл FileProtocolHandler: // 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 = коллизия не передана.

Любая помощь будет принята!

Ответы [ 2 ]

3 голосов
/ 03 апреля 2016

Я действительно не могу сказать, почему Windows удаляет параметры в локальных файлах.Как уже упоминалось в комментариях, это похоже на странные ограничения безопасности.Но однажды у меня была похожая проблема, и я нашел обходной путь, который подходит и в этой ситуации.
Просто создайте локальный временный файл 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")));
    }
}
1 голос
/ 04 апреля 2016

У меня есть решение, не быстрое (или симпатичное) решение, но, тем не менее, a решение:)

rundll32 url.dll,FileProtocolHandler передает параметры при использовании URL-адресов с протоколом http/s (попробуйте rundll32 url.dll,FileProtocolHandler http://www.google.com?q=google), чтобы вы могли настроить небольшой http-сервер (например, Jetty , я думаю), чтобы обслуживать ваши файлы справки и показывать их, используя

rundll32 url.dll,FileProtocolHandler http://localhost:[helpServerIp]/help/pophelp.html?TAG=callsubflow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...