0

我正在尝试使用 dojo 编写登录功能。就我而言,在这种情况下,我需要向 extern (!!) 服务器发出 post 请求:

登录定义如下:

登录

登录是一种特殊操作,不处理任何数据,而是对用户进行身份验证。将发出一个 POST 请求,其中包含一个带有“电子邮件”和“密码”键的 json 对象。返回值为真或假。返回一个特殊的 Cookie 以供进一步识别。

有效的 API 调用

网址:/api/login

方法:POST

领域:

电子邮件

密码

说明:以 PLIST 格式返回登录用户的所有数据。如果登录失败,则以 PLIST 格式返回 false。

好吧,我尝试通过 io.iframe.send 调用解决该问题,但出现以下错误:错误:访问属性“getElementsByTagName”的权限被拒绝

但是,我什至不确定 io.iframe 是否是解决我的问题的正确方法。

也许你可以帮助我 非常感谢

PS:我当前的代码如下所示:

function login(){
    require(["dojo/io/iframe", "dojo/dom"], function(iframe, dom){
        var email = dom.byId("logEmail").value;
        var password = dom.byId("logPassword").value;

        function JSONreq(){

            var jsonpArgs = {
                method: 'POST',
                handleAs:"json",
                content:{
                    email: email,
                    password: password

                },
                url: "http://---someServerThatIDontWantToName---/api2/login",
                load: function (response, ioargs){
                    //console.log(response)
                    alert('succes');
                },
                error: function(response, ioargs){
                    alert("error");
                }
            };
            iframe.send(jsonpArgs);
        }
        dojo.ready(JSONreq);

    });
};

移动开发有什么不同吗?跨服务器发布请求应该可以在移动设备上进行。

所以:我可以出于这个原因使用 io.iframe.send 吗?

4

2 回答 2

1

您可以使用目标 iframe 向另一个域发送 POST 请求,但不能从该 iframe 读取任何属性或 DOM 节点。

XHR2,但并非所有浏览器都支持它,服务器应该返回特定的标头。而且我不确定您是否可以通过 XHR2 发送 POST。

于 2012-04-04T14:02:04.293 回答
0

简而言之,您不能在任何给定时间通过浏览器客户端在 X 域上使用 POST 请求。原因是,DOM 在另一个命名空间上受到保护,通过 io.iframe 发生的事情是;

  1. 建立 GET 请求
  2. 查找表单,如果存在(远程)输入,则检查 foreach(本地)名称/值内容密钥对
    • 如果不存在,则创建如下:dojo.create("input", {type: "hidden", name: name, value: value}, fn);
    • 否则,在 form.element-of-name 上设置值。

因此,首先 2) 由于安全限制,DOM 查找将失败,这意味着“不存在”,然后反过来,2.1) dojo.create 将以相同的原因失败。

典型的解决方法是

  1. 在您的 x-domainserver/api/login 中打开 GET 方法(设置 url: prefix + dojo.formToQuery(form)
  2. 创建一个在轮询间隔上刷新的 url,使登录保持活动状态
  3. 在您的 samehost-server/api/login/passthrough 上创建一个“跳转主机”,服务器端会 POST 到 x-domainserver/api/login,然后返回结果。为此提供PHP解决方案

    $allowedDomains = array("http://facebook.whatever.org/", "http://yournavigation.org/");

    // x-domain 上的目标请求 uri,比如“form action” $action = $_REQUEST["url"];

    // 方法只查找 POST 并且默认 GET $method = $_REQUEST["method"];

    // 查询占位符,通过滚动 _REQUEST 填充,将附加除方法/url 对之外的所有内容 $fields = "";

    // 对 allowedDomains 授权或死亡

    foreach ($allowedDomains 作为 $domain) {

    if (strpos(substr($action, 0, strlen($domain)), $domain) !== false) {
    header("HTTP/1.0 403 Forbidden");
    die("Domain name "".$action."" not allowed. Access denied.");
    flush();
    }
    

    }

    如果(计数($_REQUEST)> 2){

    foreach ($_REQUEST as $key => $value) {
    
        if ($key != "url" && $key != "method") // append anything but url and method
            $fields .= $key . "=" . rawurlencode($value) . "&";
    }
    

    } $fields = substr($fields, 0, strlen($fields) - 1);

    // 设置 curl $ch = curl_init(); if (strtoupper($method) == "POST") { curl_setopt($ch, CURLOPT_URL, $action); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); } else { curl_setopt($ch, CURLOPT_URL, $action . "?" . $fields);
    } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_USERAGENT, "transport.php (CURL)");

    // 发送,捕获返回响应并关闭 $response = curl_exec($ch); $info = curl_getinfo($ch); curl_close($ch);

    // 回复客户端 XHR header("Content-type: ".$info["content_type"]); 回声$响应;

于 2012-04-29T02:01:48.673 回答