gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:57:53 24 4
gpt4 key购买 nike

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

<小时/>

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

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

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


}

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

Javascript

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

在 Java 中调用 Bingo(),然后我在 Java 控制台中收到错误。“java.security.AccessControlException:访问被拒绝(java.net.SocketPermission www.youtube.com:80 连接,解析)空”

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

谢谢

最佳答案

有一件事是肯定的:你有一个空的 catch block ,所以你正在吞噬任何异常,隐藏它们。既然你说函数返回 null,最可能的情况是 try-catch block 内的某个地方发生异常。将代码更改为:

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

看看 java 控制台上会出现什么。

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

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

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

第二次编辑:我检查了你的代码(粘贴到 Netbeans 中,稍作编辑,编译),它运行完美(firefox、explorer - 都在 Windows 上)并且你的症状似乎发生了变化(你要么说它返回 null,或者返回未定义,或者您根本无法调用它) - 我有最后一个想法。人们常犯的一个错误是在对象(如小程序或 Flash)真正加载之前调用它们。你在哪个阶段执行你的javascript?您确定小程序已加载吗?如果添加超时(几秒钟)或通过某个按钮上的“onclick”执行该函数会怎样?有什么改变吗?你使用的是什么浏览器?你的javascript是什么?什么操作系统?哪个插件版本?除非我们能够重现该问题,否则我们无法提供帮助。

第三次编辑:(经过问题作者的一些实验);将 javascript 调用包装到 PrivilegedgedAction 中,例如如下所示:

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

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

并且不要接受异常:-)

关于java - 在 Javascript 中请求 URL,使用 Java Applet 获取 URL 内容,返回 Javascript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4708924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com