Запросить URL в Javascript, Получить содержимое URL с помощью Java-апплета, вернуться к Javascript? - PullRequest
0 голосов
/ 17 января 2011

Я в процессе небольшого эксперимента, он захватывает страницу YouTube и возвращает ссылку MP4 самого высокого качества, а затем воспроизводит ее в элементе видео HTML 5.


Теперь я использовал PHP с cURL для получения содержимого URL (YouTube), но это работает только на моем локальном сервере (ссылка MP4 заблокирована для IP-адреса). Я не могу придумать другой способ получить содержимое страницы из-за междоменных правил, кроме апплета Java.

Итак, я построил Java-апплет, который должен возвращать содержимое URL.

Java

import java.applet.Applet;
import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.HttpURLConnection;
import java.net.URL;
//import java.net.SocketPermission;
//import java.net.URLDecoder;
//import java.net.URLEncoder;
//import java.util.Locale;
//import netscape.javascript.JSObject;

public class URLFetcherabc extends Applet
{
public String URLContent = "Currently empty";

 public void init()
 {
    System.out.println("Ready to recieve URL");
 }
 public void paint(Graphics g) {
       g.drawString("Java loaded.", 0, 10);
 }
  public void start()
  {
       String container = getURL("http://www.youtube.com/watch?v=LQ0AFriC7ZM&Bingbv", "GET"); //<-- This works
       System.out.println(container); //<-- This works
       URLContent = container;
  }
  public void bingo()
    {
      String container = getURL("http://www.youtube.com/watch?v=LQ0AFriC7ZM&Bingbv", "GET"); 
       System.out.println(container); 
      URLContent = container;
  }

  public String getURL(String url, String httpMethod)
  {
    try
    {
      URL u = new URL(url);
      HttpURLConnection conn = (HttpURLConnection)u.openConnection();
      conn.setRequestMethod(httpMethod);
      conn.setRequestProperty("User-Agent", "");
      InputStream is = conn.getInputStream();
      ByteArrayOutputStream output = new ByteArrayOutputStream();
      byte[] buffer = new byte[1024];
      for (int bytesRead = 0; (bytesRead = is.read(buffer)) != -1; ) {
        output.write(buffer, 0, bytesRead);
      }
      URLContent = output.toString();
      return URLContent;
    } catch (Exception e) {
        System.out.println(e);
    }return null;
  }


}

Теперь у меня есть апплет на моей странице, и если я запускаю метод getURL в start (), он будет корректно возвращать содержимое URL, но если я вызову метод getURL из Javascript, как это

Javascript

var URLFetcherApplet = document.getElementById('URLFetcher');
  URLFetcherApplet.bingo();

При вызове Bingo () в Java я получаю сообщение об ошибке в консоли Java. "java.security.AccessControlException: доступ запрещен (java.net.SocketPermission www.youtube.com:80 подключение, разрешение) нуль "

Так что, если я запускаю тот же метод в start (), то он работает, но если я пытаюсь получить к нему доступ через Javascript, он терпит неудачу, есть идеи относительно того, почему он это делает?

Спасибо

Ответы [ 2 ]

1 голос
/ 17 января 2011

Одно могу сказать наверняка: у вас есть пустой блок catch, поэтому вы глотаете любые исключения, скрывая их.Поскольку вы говорите, что функция возвращает ноль, наиболее вероятный сценарий - исключение, которое происходит где-то внутри блока try-catch.Измените код на:

} catch (Exception e) {
    throw new RuntimeException(e);
}

и посмотрите, что появляется на консоли Java.

Редактируйте: Если вы не готовы прислушиваться к добрым советам, донане задавайте вопросов.Я на 99,999% уверен, что ошибка действительно в вашем java-коде (независимо от того, что вы говорите в комментарии), и что добавление правильного сообщения об ошибках даст вам реальный ответ в одно мгновение.Добавьте бросок new RuntimeException (e) и посмотрите на консоль.

Могу поспорить, что вы увидите какую-то ошибку «несанкционированной операции», потому что ваш апплет, вероятно, не подписан (по крайней мере, вы не написали)что-нибудь об этом) и, следовательно, та же политика происхождения все еще применяется (если бы она не применялась для неподписанных апплетов, Java была бы одной большой дырой в безопасности).

Если окажется, что я прав, я надеюсь, что вы принимаетемой ответ, даже если вы считаете меня грубым: -)

Второе редактирование: Я проверил ваш код (вставил в Netbeans, немного отредактировал, скомпилировал), и он отлично работает (firefox, explorer - обана окнах) И ваши симптомы, кажется, сдвигаются (вы либо говорите, что он возвращает ноль, либо что он возвращает неопределенный, либо что вы вообще не можете вызвать его) - у меня есть одна последняя идея.Распространенная ошибка, которую делают люди, - это вызывать объекты (например, апплеты или flash) до того, как они действительно загрузятся.На каком этапе вы исполняете свой javascript?Вы уверены, что апплет загружен?Что если вы добавите тайм-аут (пару секунд) или выполните функцию, нажав «onclick» на какую-то кнопку?что-нибудь меняется?Какой браузер вы используете?какой у тебя javascript?какая операционная система?какая версия плагина?Если мы не сможем воспроизвести проблему, мы не сможем помочь.

Третье редактирование: (после некоторых экспериментов автора вопроса);оберните вызов javascript в действие PriviledgedAction, например, так:

public String callFromJs(final String url, final String method){

return AccessController.doPrivileged(new PriviledgetAction<String>(){
    public String run(){
        return getUrl(url, method);
    }
});
}

и не глотайте исключения: -)

0 голосов
/ 21 июня 2013
//  get the XML object
function get_xml_object() {
    if (window.ActiveXObject) return new ActiveXObject('Microsoft.XMLHTTP');
    else if (window.XMLHttpRequest) return new XMLHttpRequest();
    else {
        alert('Your browser does not support AJAX.');
        return null;
    }
}

//  fetch url
function fetch_url(whichurl) {
    var myobj=get_xml_object();
    myobj.open("GET",whichurl,false);
    myobj.send();
    return myobj.responseText;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...