2017-05-01 8 views
1

Google JSP 페이지에서 Google recaptcha 위젯을 렌더링하고 양식을 제출할 때 프로그래밍 방식으로 내 Java 스크립트에서 도전 과제를 호출합니다.Invisible recaptcha 도전 과제를 프로그램 방식으로 호출합니다. 페이지 새로 고침시 항상 grecaptcha.getResponse()가 비어 있습니다.

<script type="text/javascript" id="recaptcha-response">  
    var siteKey = $('#recaptchasitekey').first().text();  
     var onloadCallback = function() {   
      grecaptcha.render('recaptcha_element', { 
       'sitekey' : siteKey, 
       'callback' : correctCaptcha, 
       'data-bind' : "qoActionTemplate" 
      },true);    
      }; 
     var correctCaptcha = function(response) {   
      return response; 
     }; 

    </script> 
     <div class="g-recaptcha" id="recaptcha_element" data-size="invisible" ></div>  
     <script src="http://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>  
    <script type="text/template" id="recaptchaUrl"> 

다음은 도전을 불러오는 Java 스크립트 코드입니다.

executeRecaptcha : function() { 
      grecaptcha.execute(); 
      captcha.token = grecaptcha.getResponse(); 
      if (captcha.token == null || captcha.token == '') { 
       grecaptcha.reset(); 
       grecaptcha.execute(); 
      } 
      return captcha.token; 
     }, 

    validateRecaptcha : function(response,checkToken) { 
      captcha.executeRecaptcha(); 
      if (captcha.token) { 
       var captchaUrl = $('#recaptchaUrl').first().text(); 
       captcha.userSIDVerify = $('#captcha_token').val(); 
       $.ajax({ 
        type : 'POST',   
        url : captchaUrl, 
        data : { 
         response : captcha.token 
        }, 
        success : captcha.checkToken, 
        error : function() { 
         alert("failed") 
         return; 
        } 
       }); 
      } 
     } 

grecaptcha.getResponse()는 항상 내가이 응답을 제출하는 두 번째 시간 후 처음으로 양식 제출에 비어 있습니다.

답변

0

확신 할 수는 없지만 grecaptcha.execute() 다음에 grecaptcha.getResponse()을 직접 호출하여 보이지 않는 reCaptcha를 사용하는 의도 된 방식이 아니기 때문입니다. grecaptcha.execute()은 작업하는 데 시간이 걸리고 (저는 가정합니다) data-callback 메서드로 비동기 적으로 반환하도록 설계되었습니다. 그게 이 완료되면 언제든지 grecaptcha.getResponse()을 사용하여 (grecaptcha.reset()에 전화하기 전에) 응답 토큰을 얻을 수 있습니다. 나는 이것이 grecaptcha.getResponse() 뒤에있는 생각이라고 생각합니다. 보이지 않는 reCaptcha를 처리 할 시간이 있었기 때문에 두 번째로 작동한다고 가정합니다. 제 생각에는 grecaptcha.getResponse()도 보이지 않는 reCaptcha를위한 것입니다. 일반 reCaptcha는 양식 제출시 보이지 않는 reCaptcha가 "완료"된 사용자에 의해 "완료"되기 때문에 콜백이 필요하므로 완성되었음을 알려줍니다.