我正在进行一些实验,它会抓取一个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访问它就会失败,任何关于它为什么这样做的想法?
由于
答案 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;
}