reCAPTCHA 在位置 0 的 JSON 中出现意外标记
reCAPTCHA Unexpected token in JSON at position 0
我们使用 reCAPTCHA ver 2 作为复选框“我不是机器人”。从 2020-11-05 19:23:00Z 开始,在我们的页面加载期间出现异常:
recaptcha__ru.js:211 Uncaught (in promise) SyntaxError: Unexpected token in JSON at position 0
at JSON.parse (<anonymous>)
at recaptcha__ru.js:211
at recaptcha__ru.js:209
at Array.<anonymous> (recaptcha__ru.js:132)
at Array.<anonymous> (recaptcha__ru.js:208)
at GM.$ (recaptcha__ru.js:211)
at Array.<anonymous> (recaptcha__ru.js:253)
at QS.next (recaptcha__ru.js:416)
at y (recaptcha__ru.js:355)
我们的页面没有改变。 reCAPTCHA 在一瞬间意外中断。在其他页面上,reCAPTCHA 仍在工作(工作页面嵌入到 iframe 中可能很重要)。
有什么提示吗?出了什么问题?
已更新
我们尝试按照 @user2384519 的建议,在 JSP 页面的 iframe 中隔离 reCAPTCHA:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Captcha test</title>
<script>
function extractRecaptchaResponse() {
var c = document.getElementById('g-recaptcha-isolator');
if (c) {
var src = c.contentWindow.document
.getElementById('g-recaptcha-response');
if (src) {
var target = document.getElementById('g-recaptcha-response');
target.value = src.value;
}
}
return true;
}
</script>
</head>
<body>
<h:form id="g-recaptcha-form">
<h:panelGroup>
<iframe id="g-recaptcha-isolator" src="/recaptcha.htm"
onload='javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+"px";}(this));'
style="height: 78px; width: 100%; border: none; overflow: hidden;">
</iframe>
</h:panelGroup>
<textarea id="g-recaptcha-response" name="g-recaptcha-response"
style="display: none"></textarea>
<h:panelGroup>
<h:commandLink onclick="extractRecaptchaResponse()"
actionListener="#{recaptcha.submit}">
<span>Submit</span>
</h:commandLink>
</h:panelGroup>
</h:form>
</body>
</html>
recaptcha.htm:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<script src="https://www.google.com/recaptcha/api.js"></script>
</head>
<body>
<div class="g-recaptcha" data-sitekey="xxxxxxx"></div>
它解决了 JSON 错误的问题,但 reCAPTCHA 会显示带有图像选择器的弹出窗口,而 iframe 会剪切弹出窗口。
我们在11月5日也遇到了同样的问题。为了快速修复,我们在 iframe 中嵌入了 recaptcha。它被 ajax4jsf/framework.pack.js
屏蔽了
我们遇到了同样的问题,然后确定问题是由同一页面上加载的另一个缩小的 js 文件引起的冲突。
我们将页面上加载的 js 减少到最低限度,消除了冲突,现在它又可以正常工作了。
如果您使用的是Prototype.js:
Prototype JS 库覆盖了 class Array
中的方法 reduce
。
如果您在所有导入之后添加以下脚本(最好在 body 标签之后),问题就解决了:
Array.prototype.reduce = function(callback, initialVal) {
var accumulator = (initialVal === undefined) ? undefined : initialVal;
for (var i = 0; i < this.length; i++) {
if (accumulator !== undefined)
accumulator = callback.call(undefined, accumulator, this[i], i, this);
else
accumulator = this[i];
}
return accumulator;
};
我们使用 reCAPTCHA ver 2 作为复选框“我不是机器人”。从 2020-11-05 19:23:00Z 开始,在我们的页面加载期间出现异常:
recaptcha__ru.js:211 Uncaught (in promise) SyntaxError: Unexpected token in JSON at position 0
at JSON.parse (<anonymous>)
at recaptcha__ru.js:211
at recaptcha__ru.js:209
at Array.<anonymous> (recaptcha__ru.js:132)
at Array.<anonymous> (recaptcha__ru.js:208)
at GM.$ (recaptcha__ru.js:211)
at Array.<anonymous> (recaptcha__ru.js:253)
at QS.next (recaptcha__ru.js:416)
at y (recaptcha__ru.js:355)
我们的页面没有改变。 reCAPTCHA 在一瞬间意外中断。在其他页面上,reCAPTCHA 仍在工作(工作页面嵌入到 iframe 中可能很重要)。
有什么提示吗?出了什么问题?
已更新
我们尝试按照 @user2384519 的建议,在 JSP 页面的 iframe 中隔离 reCAPTCHA:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Captcha test</title>
<script>
function extractRecaptchaResponse() {
var c = document.getElementById('g-recaptcha-isolator');
if (c) {
var src = c.contentWindow.document
.getElementById('g-recaptcha-response');
if (src) {
var target = document.getElementById('g-recaptcha-response');
target.value = src.value;
}
}
return true;
}
</script>
</head>
<body>
<h:form id="g-recaptcha-form">
<h:panelGroup>
<iframe id="g-recaptcha-isolator" src="/recaptcha.htm"
onload='javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+"px";}(this));'
style="height: 78px; width: 100%; border: none; overflow: hidden;">
</iframe>
</h:panelGroup>
<textarea id="g-recaptcha-response" name="g-recaptcha-response"
style="display: none"></textarea>
<h:panelGroup>
<h:commandLink onclick="extractRecaptchaResponse()"
actionListener="#{recaptcha.submit}">
<span>Submit</span>
</h:commandLink>
</h:panelGroup>
</h:form>
</body>
</html>
recaptcha.htm:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<script src="https://www.google.com/recaptcha/api.js"></script>
</head>
<body>
<div class="g-recaptcha" data-sitekey="xxxxxxx"></div>
它解决了 JSON 错误的问题,但 reCAPTCHA 会显示带有图像选择器的弹出窗口,而 iframe 会剪切弹出窗口。
我们在11月5日也遇到了同样的问题。为了快速修复,我们在 iframe 中嵌入了 recaptcha。它被 ajax4jsf/framework.pack.js
屏蔽了我们遇到了同样的问题,然后确定问题是由同一页面上加载的另一个缩小的 js 文件引起的冲突。
我们将页面上加载的 js 减少到最低限度,消除了冲突,现在它又可以正常工作了。
如果您使用的是Prototype.js:
Prototype JS 库覆盖了 class Array
中的方法 reduce
。
如果您在所有导入之后添加以下脚本(最好在 body 标签之后),问题就解决了:
Array.prototype.reduce = function(callback, initialVal) {
var accumulator = (initialVal === undefined) ? undefined : initialVal;
for (var i = 0; i < this.length; i++) {
if (accumulator !== undefined)
accumulator = callback.call(undefined, accumulator, this[i], i, this);
else
accumulator = this[i];
}
return accumulator;
};