在Javascript中请求URL,使用Java Applet获取URL内容,返回Javascript?

时间:2011-01-16 23:51:19

标签: java javascript url curl permissions

我正在进行一些实验,它会抓取一个YouTube页面,并返回最高质量的MP4链接,然后在HTML 5视频元素中播放。


现在我使用PHP和cURL来获取URL内容(YouTube),但这只适用于我的本地服务器(MP4链接锁定到IP地址)。除了Java小程序之外,由于跨域规则,我无法想到获取页面内容的任何其他方式。

所以我构建了一个应该返回URL内容的Java applet。

爪哇

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;
  }


}

现在我的applet已经在我的页面上了,如果我在start()中运行getURL方法,它将正确返回URL内容,但是,如果我从这样的Javascript中调用getURL方法

的Javascript

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

在Java中调用Bingo()然后我在Java控制台中收到错误。 “java.security.AccessControlException:access denied(java.net.SocketPermission www.youtube.com:80 connect,resolve) 空“

因此,如果我在start()上运行相同的方法,那么它可以工作,但如果我尝试通过Javascript访问它就会失败,任何关于它为什么这样做的想法?

由于

2 个答案:

答案 0 :(得分:1)

有一件事是肯定的:你有一个空的捕获块,所以你吞下任何异常,隐藏它们。由于您说该函数返回null,最可能的情况是在try-catch块内的某处发生异常。将代码更改为:

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

并查看java控制台上的内容。

编辑:如果您还没准备好听取好的建议,请不要提问。我99.999%确定故障确实存在于您的java代码中(无论您在评论中说什么),并且添加正确的错误报告将立即为您提供真正的答案。添加throw new RuntimeException(e)并查看控制台。

我敢打赌你会看到某种“未经授权的操作”错误,因为你的小程序可能没有签名(至少你没有写任何关于它的东西),因此同样的原始政策仍然适用(如果它没有申请未签名的applet,Java将是一个巨大的安全漏洞。)

如果事实证明我是对的,即使你认为我粗鲁,我也希望你接受我的回答: - )

第二次编辑:我检查了你的代码(粘贴到Netbeans,很少编辑,编译),它完美运行(firefox,资源管理器 - 都在Windows上)你的症状似乎转移(你要么说它返回null,或者它返回undefined,或者你根本无法调用它 - 我有一个最后的想法。人们常犯的一个错误是在真正加载之前调用对象(如applet或flash)。你在什么阶段执行你的JavaScript?你确定applet已加载吗?如果添加超时(几秒钟)或从某个按钮上的“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);
    }
});
}

并且不要吞下例外: - )

答案 1 :(得分:0)

//  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;
}