这是一个Q& A风格的帖子,我将发布问题和答案。主要原因是我花了很多时间搜索验证recaptcha V2的最简单方法。因此,我将分享我的知识,以避免开发人员进一步浪费时间。
如何使用 Java 对 reCAPTCHA V2 或隐形reCAPTCHA 进行服务器端验证?
答案 0 :(得分:6)
我正在使用org.json
库。从here获取jar
文件或阅读docs。将jar文件添加到项目中并导入以下类。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.Charset;
import org.json.JSONObject;
使用以下方法进行验证。
/**
* Validates Google reCAPTCHA V2 or Invisible reCAPTCHA.
* @param secretKey Secret key (key given for communication between your site and Google)
* @param response reCAPTCHA response from client side. (g-recaptcha-response)
* @return true if validation successful, false otherwise.
*/
public synchronized boolean isCaptchaValid(String secretKey, String response) {
try {
String url = "https://www.google.com/recaptcha/api/siteverify?"
+ "secret=" + secretKey
+ "&response=" + response;
InputStream res = new URL(url).openStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(res, Charset.forName("UTF-8")));
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
String jsonText = sb.toString();
res.close();
JSONObject json = new JSONObject(jsonText);
return json.getBoolean("success");
} catch (Exception e) {
//e.printStackTrace();
}
return false;
}
调用上面的方法,如下所示,
if(isCaptchaValid("enter_your_key_here", request.getParameter("g-recaptcha-response"))){
//valid
}
希望这会有所帮助。干杯!
答案 1 :(得分:0)
只需提供另一个变体:
import javax.inject.Inject;
import javax.validation.constraints.NotNull;
import javax.ws.rs.client.*;
import javax.ws.rs.core.*;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.databind.*;
@Component
public class ReCaptcha {
private final WebTarget webTarget;
public ReCaptcha() {
webTarget = ClientBuilder.newClient()
.target("https://www.google.com/recaptcha/api/siteverify")
.queryParam("secret", "6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe");
}
public boolean isValid(@NotNull String token) throws IOException {
Response response = this.webTarget.queryParam("response", token)
.request(MediaType.APPLICATION_JSON)
.accept("application/ld+json")
.get();
if (response.getStatus() != 200)
return false;
String stringResponse = response.readEntity(String.class);
JsonNode jsonNode = new ObjectMapper().readTree(stringResponse);
return jsonNode.get("success").asBoolean();
}
}
此外,您可以验证返回的主机名和操作。 另外,您可能要记录返回的错误代码。
您将必须用自己的API密钥替换(这是一个测试API密钥,应始终返回该令牌有效:https://developers.google.com/recaptcha/docs/faq) 将API密钥和API网址放入额外的属性文件中也是一个好主意。
您可以在任何喜欢的地方注入此类。
我将其与特殊异常一起使用,而不是返回true或false。
答案 2 :(得分:0)
与网络邮件脚本和注释框一起使用:
if(isCaptchaValid("secret", request.getParameter("g-recaptcha-response"))){
request.setAttribute("Captcha", "true");
try {
Mailserver.sendEmail(host, port, user, pass, recipient, subject, name, email, content);
resultMessage = "The e-mail is sent successfully!";
getServletContext().getRequestDispatcher("/captchacorrect.jsp").forward(request, response);
} catch (Exception ex) {
ex.printStackTrace();
resultMessage = "An error occured: " + ex.getMessage();
} finally {
request.setAttribute("Message", resultMessage);
}
} else {
getServletContext().getRequestDispatcher("/captchawrong.jsp").forward(request, response);
} }