【问题标题】:Ajax post always results in error, even though everything seems correctAjax 发布总是导致错误,即使一切看起来都是正确的
【发布时间】:2012-10-08 20:13:23
【问题描述】:

我正在尝试使用 google 的 reCaptcha 在表单验证中处理验证码。基本上,我的验证函数是在表单标签中使用 onSubmit 调用的,然后调用第二个函数来处理 recaptcha api。

代码如下:

        var returnValue;

        var myData = {
            privatekey  : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            remoteip : ip,
            challenge : challenge,
            response : response
        };

        $.ajax({
            url: "http://www.google.com/recaptcha/api/verify",
            type: "POST",
            data: JSON.stringify(myData),
            dataType: "text",
            success: function(data) {
                var result = data.split("\n");
                if (result[0] == "true") {
                    returnValue = true;
                }
                else {
                    returnValue = false;
                }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                alert("There was an error submitting the captcha.  Please contact an administrator. \n\nError:\n" + textStatus, errorThrown);
                returnValue = false;                    
            },
            complete: function(jqXHR, textStatus) {
                return returnValue;
            }
        });

在 Firefox 中使用 LiveHTTPHeaders,我可以看到请求发送到服务,并且看起来一切都被正确发送。我得到一个 HTTP/1.1 200 OK 响应,但每次代码都进入错误函数。错误函数运行时,jqXHR为:

对象 { readyState=0, status=0, statusText="error"}

textStatus 是“错误”,errorThrown 是“”

我尝试了多种方法,包括 $.POST,以及使用 .done()、.fail()、.always(),但它的行为始终相同。

我在这里看到了一些与跨域请求问题有关的其他帖子,但这些情况似乎都不相关,因为我实际上正在执行跨域请求,而这些似乎是问题他们正在向同一域中的文件发出请求,并且作为跨域请求被错误地处理。

我在这里束手无策。任何帮助将不胜感激。

【问题讨论】:

  • 您可能不应该在 SO 问题中发布您的私钥。
  • 附注:I've tried doing this a number of ways, including $.POST, and using .done(), .fail(), .always(), and it always behaves the same. 这三种方法的目的与错误、成功和完成相同。现在应该在功能上有所不同,除了它们现在在准备成功时首选,错误和完成将根据文档在未来被弃用。

标签: javascript jquery ajax cors recaptcha


【解决方案1】:

我在这里看到了一些与跨域请求问题有关的其他帖子,但这些情况似乎都不相关,因为我实际上是在做一个跨域请求

当我运行该代码时,我得到了错误:

XMLHttpRequest cannot load http://www.google.com/recaptcha/api/verify.
Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin.

所以这是一个跨域问题。您可能想要发出跨域请求,但 Google 并未设置允许它。

我很确定需要使用 server 端代码来实现 recaptcha。如果你完全在客户端上用 JS 做,那么客户端可以撒谎说它已经通过了验证码,而实际上它没有通过。

【讨论】:

  • 感谢您的信息。我从未见过那个错误,但我最终实现了一种不同类型的验证码。我很想使用服务器端的东西,但我试图添加它的网站只是纯 html,我不想重新设计整个东西:/(加上客户不想付钱这么多,大声笑)。
【解决方案2】:
function check(){
    $.post('check.php',{
        'check':1,
        'challenge':$('#recaptcha_challenge_field').val(),
        'response':$('#recaptcha_response_field').val()},
        function(a){
            console.log(a);
        });
}

检查.php:

if($_POST){
    if(isset($_POST['check'])){
        $url = 'http://www.google.com/recaptcha/api/verify';

        $data = array(
            'privatekey'=>  "**********************************",
            'remoteip'  =>  $_SERVER['REMOTE_ADDR'],
            'challenge' =>  $_POST['challenge'],
            'response'  =>  $_POST['response'],
        );
        $options = array(
            'http' => array(
                'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                'method'  => 'POST',
                'content' => http_build_query($data),           
            ),
        );
        echo print_r($data,true);
        die(file_get_contents($url, false, stream_context_create($options)));
    }
}

警告:您只有一个选择要检查! (Ref.)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多