Java Recaptcha.widget为空,因此在Recaptcha验证失败时不会呈现表单

Java Recaptcha.widget为空,因此在Recaptcha验证失败时不会呈现表单,java,javascript,recaptcha,Java,Javascript,Recaptcha,致力于在CMS集成网站中实施recaptcha。首先是我的HTMl body标记,它调用javascript方法在加载body时创建一个recaptcha <body onload="return reloadRecaptcha();"> 当我将包含repatcha答案的表单提交给servlet,servlet验证答案并在出错时转发回同一表单时,我在浏览器的控制台中收到以下错误 在CHROME中,错误消息“UncaughtTypeError:无法将属性'innerHTML

致力于在CMS集成网站中实施recaptcha。首先是我的HTMl body标记,它调用javascript方法在加载body时创建一个recaptcha

    <body onload="return reloadRecaptcha();">
当我将包含repatcha答案的表单提交给servlet,servlet验证答案并在出错时转发回同一表单时,我在浏览器的控制台中收到以下错误

  • 在CHROME中,错误消息“UncaughtTypeError:无法将属性'innerHTML'设置为null”@line recaptcha_ajax.js:112
  • 在firefox中,错误消息“TypeError:Recaptcha.widget为null”@line Recaptcha_ajax.js:112
我不知道为什么当我在出错时转发表单jsp时,只有我得到这个错误,而不是在表单的初始加载期间

我的服务器端代码(servlet)的代码片段:

我从错误中看到的是,当表单重新加载以显示验证错误消息时,它找不到div#recap


它总是作为html的一部分出现,就在主窗体的下面

当我点击这个url“http:///vgn-ext-templating/v/index.jsp?vgnextoid=40289c7c6099f210VgnVCM100000268315acRCRD&vgnextfmt=default“直接从浏览器中,recaptcha和表单会按预期显示,但只有在出现错误并转发回表单时才会出现问题。感谢您的帮助

    function reloadRecaptcha() {
    console.log("@ reloadRecaptcha ");
    var publicKey = "";
    var strServername = location.hostname;

    if (strServername.indexOf("01") >= 0 || strServername.indexOf("02") >= 0 ){ 
        publicKey = "HARDCODED_INTERNAL_KEY1";
    } else {
        publicKey = "HARDCODED_PUBLIC_KEY2";
    }

    var div = "recap";

    if (!$("#message").is(":empty")) {
        console.log("@ if Recaptcha.create ");
        Recaptcha.create(publicKey,div,{theme: "red", callback: Recaptcha.focus_response_field});
    } else {
        console.log("@ else Recaptcha.create ");
        Recaptcha.create(publicKey,div,{theme: "red"});
    }
    console.log("@ Exit reloadRecaptcha ");
    return false;
}
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException  {
System.out.println("***** In the Captcha Validatation servlet**** ");
ReCaptchaImpl reCaptcha = new ReCaptchaImpl();
String remoteAddr = request.getRemoteAddr();
String strServerUrl = request.getServerName().toLowerCase();
String strPrivateKey = "";
if ((strServerUrl.indexOf("01") >= 0) || (strServerUrl.indexOf("02") >= 0))
  strPrivateKey = getPropertyString("recaptcha.internal.privatekey");
else {
  strPrivateKey = getPropertyString("recaptcha.external.privatekey");
}
reCaptcha.setPrivateKey(strPrivateKey);
String challenge = request.getParameter("recaptcha_challenge_field");
String uresponse = request.getParameter("recaptcha_response_field");
ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(remoteAddr, challenge, uresponse);
HttpSession session = request.getSession(false);
if (session != null) {
  String sessionId = session.getId();
  Map paramMap = new HashMap();
  for (Enumeration e = request.getParameterNames(); e.hasMoreElements(); ) {
    String key = (String)e.nextElement();
    String value = request.getParameter(key);
    paramMap.put(key, value);
  }
  session.setAttribute("paramMap", paramMap);
  if (reCaptchaResponse.isValid())
  {
    StringBuilder successUrl = new StringBuilder();
    successUrl.append(getPropertyString("recaptcha.validationsuccess.url"));
    successUrl.append("?evtvar=").append(request.getParameter("evtvar"));
    successUrl.append("&vgnextoid=").append(request.getParameter("vgnextoid"));
    RequestDispatcher rd = request.getRequestDispatcher(successUrl.toString());
    rd.forward(request, response);
  }
  else
  {
    System.out.println("***** reCaptchaResponse INVALID *** ");
    session.setAttribute("error1", getPropertyString("recaptcha.validationfailure.message"));
    System.out.println("SERVLET PATH --> " + request.getServletPath());
    String url_form = "/vgn-ext-templating/v/index.jsp?vgnextoid=40289c7c6099f210VgnVCM100000268315acRCRD&vgnextfmt=default";
    System.out.println("Forwarding to the url after captcha validation  --> " + url_form);
    RequestDispatcher rd = request.getRequestDispatcher(url_form);
    rd.forward(request, response);
  }
}}
    <div id="recap" style="height:130px;"></div>