繁体   English   中英

使用 dojo 向外部服务器发送请求登录

[英]login with dojo post request to extern server

我正在尝试使用 dojo 编写登录名 function。在这种情况下,我需要向外部 (:!) 服务器发出发布请求:

登录定义如下:

登录

登录是一个特殊的操作,不处理任何数据,而是对用户进行身份验证。 将发出一个 POST 请求,其中包含 json object 以及键“email”和“password”。 返回值为 true 或 false。 返回一个特殊的 Cookie 以供进一步识别。

有效 API 调用

URL:/API/登录

方法:邮寄

领域:

email

密码

说明:以 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 吗?

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

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

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

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

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

典型的解决方法是

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

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

    // x 域上的目标请求 uri,比如“表单操作” $action = $_REQUEST["url"];

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

    // 查询占位符,通过 _REQUEST 滚动填充,将 append all but method / url pairs $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(); 如果 (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"]); 回声$响应;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM