使用javascript的URL验证/连接

使用javascript的URL验证/连接,javascript,ajax,cross-domain,Javascript,Ajax,Cross Domain,我想使用javascript验证外部url是否有效/存在/响应。例如,“www.google.com”应该返回true,“www.google123.com”应该返回false 为此,我想通过测试:if(xmlhttp.readyState==4&&xmlhttp.status==200)来使用AJAX,但这似乎不适用于远程服务器(外部URL)。由于我的服务器使用代理,我计划使用浏览器端脚本,以便它自动使用用户的浏览器代理(如果存在)。 请告诉我我必须使用“AJAX跨域”吗?如何实现这一点,因为

我想使用javascript验证外部url是否有效/存在/响应。例如,“www.google.com”应该返回true,“www.google123.com”应该返回false

为此,我想通过测试:if(xmlhttp.readyState==4&&xmlhttp.status==200)来使用AJAX,但这似乎不适用于远程服务器(外部URL)。由于我的服务器使用代理,我计划使用浏览器端脚本,以便它自动使用用户的浏览器代理(如果存在)。 请告诉我我必须使用“AJAX跨域”吗?如何实现这一点,因为我只想验证url。
除了使用AJAX,还有其他方法吗?

我很确定这是不可能的。任何允许您在用户上下文中调用另一个域上的随机页面的AJAX都会打开各种各样的漏洞或安全漏洞


您必须使用服务器端解决方案。

避免跨域问题的通常方法是插入标记。像image或script这样的标记可以从任何域加载其内容。您可以插入,比如说一个类型为“text/x-unknown”的脚本标记或其他内容,并侦听标记加载事件。当加载事件触发时,可以再次从页面中删除脚本标记

当然,如果您正在查找的文件恰好是图像,那么您可以改为
newimage()
。这样,您就不必通过注入标签来污染页面,因为图像在创建时会加载(这可用于预加载图像)。同样,只需等待图像上的加载事件

更新

好吧,看来我是在仓促下结论。浏览器之间在如何支持这一点上存在一些差异。下面是一个完整的示例,介绍了如何在IE9和最新版本的Firefox、Chrome和Safari中使用script标记验证URL

它在旧版本的IE(至少IE8)中不起作用,因为它们显然不为脚本标记提供加载/错误事件

如果脚本标记的contenttype不为空或设置为“text/javascript”,Firefox将拒绝加载任何内容。这意味着使用这种方法检查脚本文件可能有点危险。似乎脚本标记在我的测试中执行任何代码之前就被删除了,但我不确定

无论如何,下面是代码:

<!doctype html>
<html>
<head>
    <script>
        function checkResource(url, callback) {
            var tag = document.createElement('script');
            tag.src = url;
            //tag.type = 'application/x-unknown';
            tag.async = true;
            tag.onload = function (e) {
                document.getElementsByTagName('head')[0].removeChild(tag);
                callback(url, true);
            }
            tag.onerror = function (e) {
                document.getElementsByTagName('head')[0].removeChild(tag);
                callback(url, false);
            }
            document.getElementsByTagName('head')[0].appendChild(tag);
        }
    </script>
</head>
<body>
    <h1>Testing something</h1>
    <p>Here is some text. Something. Something else.</p>
    <script>
        checkResource("http://google.com", function (url, state) { alert(url + ' - ' + state) });
        checkResource("http://www.google.com/this-does-not-exists", function (url, state) { alert(url + ' - ' + state) });
        checkResource("www.asdaweltiukljlkjlkjlkjlwew.com/does-not-exists", function (url, state) { alert(url + ' - ' + state) });
    </script>
</body>
</html>

函数checkResource(url、回调){
var tag=document.createElement('script');
tag.src=url;
//tag.type='application/x-unknown';
tag.async=true;
tag.onload=函数(e){
document.getElementsByTagName('head')[0].removeChild(标记);
回调(url,true);
}
tag.onerror=函数(e){
document.getElementsByTagName('head')[0].removeChild(标记);
回调(url,false);
}
document.getElementsByTagName('head')[0].appendChild(标记);
}
测试某事
这里有一些文字。某物还有别的

检查资源(“http://google.com“,函数(url,state){alert(url+'-'+state)}); 检查资源(“http://www.google.com/this-does-not-exists“,函数(url,state){alert(url+'-'+state)}); checkResource(“www.asdaweltiuklkjlkjlwew.com/不存在”,函数(url,状态){alert(url+'-'+状态)});
当url未返回图像时,如何使用图像标记来测试url的有效性。例如,将不起作用,它将始终转到错误部分,对于有效的URL也是如此。还有其他方法吗?你不能使用图像来测试不是图像的URL,但我相信你可以使用脚本标记。只需将脚本标记类型设置为“text/plain”或其他类型,这样它就不会试图将其作为javascript进行处理。在这种情况下,您必须将标记插入页面,并将callback函数附加到其onload事件。如果资源存在,则将调用回调。您还可以向OneError添加一个回调,如果资源不存在,将调用该回调。脚本“type”标记采用“text/tcl”、“text/javascript”、“text/vbscript”等值。现在,它不起作用了。没有警报。还有其他建议吗?你是对的-这是一个麻烦的跨浏览器。我增加了一个例子。我手头没有任何与旧版本IE兼容的解决方案,但您可能可以对onreadystate事件进行处理。正如我所说,我的服务器使用代理,因此当我在URL构造函数中创建指定代理的HttpURLConnection时,它可以正常工作,但对于https连接,我再次面临问题。作为HttpsURLConnection con=(HttpsURLConnection)url.openConnection()-不工作,仅适用于HttpURLConnection。那么,如何实现这个简单的事情呢?可能会有帮助。这听起来还不是特别简单,我不认为URL的openConnection()返回的对象可以类型转换为HttpsURLConnection;尽管可以将其强制转换为HttpURLConnection,但HttpsURLConnection connection=(HttpsURLConnection)url.openConnection();此外,我对浏览器端验证更感兴趣,因此我不必使用这些代理设置。