使用 javascript 的 URL 验证/连接

Posted

技术标签:

【中文标题】使用 javascript 的 URL 验证/连接【英文标题】:URL validation/connectivity using javascript 【发布时间】:2011-11-28 08:47:53 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

正如我所说我的服务器使用代理,所以当我在 URL 构造函数中创建一个指定代理的 HttpURLConnection 时,它工作正常,但对于 https 连接,我又遇到了问题。由于 HttpsURLConnection con =(HttpsURLConnection) url.openConnection();-不起作用,仅适用于 HttpURLConnection。那么,如何实现这个简单的东西呢? ***.com/questions/1511674/… 可能会有所帮助。听起来仍然不是特别简单。 我不认为 URL 的 openConnection() 返回的对象可以类型转换为 HttpsURLConnection;虽然可以强制转换为 HttpURLConnection,但 HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();此外,我对浏览器端验证更感兴趣,因此我不必进行这些代理设置。【参考方案2】:

避免跨域问题的常用方法是注入标签。像图像或脚本这样的标签可以从任何域加载它们的内容。你可以注入,比如说一个类型为“text/x-unknown”或其他东西的脚本标签,然后监听标签加载事件。当加载事件触发时,您可以再次从页面中移除脚本标签。

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

更新

好的,看来我在这里草率下结论。浏览器之间在如何支持这一点上存在一些差异。下面是一个完整的例子,说明如何在 IE9 和最新版本的 Firefox、Chrome 和 Safari 中使用 script 标签来验证 url。

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

如果 script-tag 的 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>

【讨论】:

如何在不返回图像时使用图像标签来测试 url 的有效性。例如, google.com" onerror="alert('This google image could not be loaded.')" /> 不起作用,它总是会进入错误部分,对于有效的 url 也是如此。还有什么办法吗? 您不能使用图像来测试不是图像的 url,但我相信您可以使用脚本标签。只需将脚本标签类型设置为“text/plain”或其他内容,因此它不会尝试将其作为 javascript 处理。在这种情况下,您必须将标签插入页面,并将回调函数附加到它的 onload 事件。如果资源存在,则将调用回调。你也可以给 onerror 添加一个回调,如果资源不存在就会被调用 脚本“type”标签采用“text/tcl”、“text/javascript”、“text/vbscript”等值。现在, 不起作用。没有警报。还有其他建议吗? 你是对的 - 这是一个麻烦的跨浏览器。我添加了一个例子。我手头没有任何与旧版本 IE 兼容的解决方案,但您可以使用 onreadystate 事件做一些事情。

以上是关于使用 javascript 的 URL 验证/连接的主要内容,如果未能解决你的问题,请参考以下文章

在 javascript 中使用身份 ADFS URL 进行 HTML 页面身份验证

Javascript 图像 URL 验证

JavaScript JavaScript中的URL验证

JavaScript中的URL验证

javascript [JS] URL Regex验证

JavaScript JQuery URl验证