ajax跨域请求的解决方案

对于所谓的跨域问题,可能没有亲自接触过的朋友很难想像他是怎么回事。

为了让大家有个比较清醒的认识,先请看下面的例子:

当前我的站点为:http://hqlong.com;

那么所有基于http://hqlong.com的访问都属于当前主机域,如果我在当前网内想访问外面的某一网站:http://www.test.com,那么这里,这个站点就已经不再属于当前站点的域了,这里,就称之为跨域访问。

IE和基于Mozilla的浏览器处理跨域请求有所不同。你可以在IE中执行跨域请求;然而,这需要改变浏览器默认的安全设置,或者添加特定的主机到你的“信任主机”列表中。所以当我们在想进行请求域外的一个请求的,这里,就出现了跨域访问,当然,这肯定也是不能成功的。

在实际项目中,很有可能需要用来异步请求域外的站点,对于这种,情况,我们应该怎么办呢?

虽然ajax不具有域外访问的功能,但我们域内的服务器端程序可具有这种访问功能,即:php可以向域外的站点发出请求。所以我们可以把访问的功能转移给本域内的php程序,让它来完成对域外站点的访问。

大致通信流程如下:

ajax -请求->>  http://hqlong.com/auth.php(域内php程序) --请求->> http://www.test.com(域外站点)

ajax请求域内的代码,我这里就不列出来了。大家可以像平时写ajax代码那样来写,只要把需要传递的参数向域内的php程序传递过去就行了,建议大家使用prototype框架的ajax对象来进行请求,它可以使大家很方便得创建一个ajax对象来进行异步请求。

下面来看一下我们的php程序怎么向域外站点进行访问的,当然,如果大家使用zendframework框架的话,里面有现存的Zend_Http_Client类来进行我们的http请求。不过没使用也没关系,我们可以自己写一个。其实它们请求的原理是一样的。

    1.首先建立到目标站点的连接。

    2.向连接资源写入传递的信息。

   这里是我本机的一段测试代码。大家可能把里面的主机,URL,和参数改成自己的来使用。

代码如下:

 

$req = "username=".trim($_POST['username'])."&password=".trim($_POST['password']);
    $header   .=   "POST /test.php HTTP/1.0\r\n";//请求页面
    $header   .=   "HOST: hqlong.com\r\n";//访问主机hqlong.com
    $header   .=   "Content-Type: application/x-www-form-urlencoded\r\n"; 
    $header   .=   "Content-Length:".strlen($req)."\r\n\r\n"; 
    //建立起和hqlong.com的连接
    $fp   = fsockopen('hqlong.com', 80,  $errno, $errstr, 30);
    if(!$fp){

    } else {
        fputs($fp,$header.$req); 
        while(!feof($fp)){ 
            $res = fgets($fp, 1024);
            echo $res;
        }
    }
    fclose   ($fp);

 相信上面的请求代码大家一定不会陌生,在这里,大家需要特别注意http头信息的书写格式,一旦它被书写错了,那么我们所请求的页面将不知道如何来解析我们的请求。注意上面的 \r\n,一定要特别注意。

好了,基本上整个实现过程就这样了,虽然在这里没有给大家赋上完整的可运行的源代码,但我相信,大家应该是可以理解的。如果有什么不明白,或者不清楚的地方,欢迎随时进行交流。

机器人 2007-10-19 11:04 (周末人的心情就是不一样)。

 

此条目发表在 LAMP 分类目录,贴了 , , 标签。将固定链接加入收藏夹。

ajax跨域请求的解决方案》有 2 条评论

  1. 匿名 说:

    非常感谢朋友的共享精神!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>