如何验证 reCAPTCHA V2 Java (Servlet)

2024-01-03

这是一个问答风格的帖子,我将同时发布问题和答案。主要原因是我花了相当多的时间寻找验证 recaptcha V2 的最简单方法。因此,我将分享我的知识,以避免进一步浪费开发人员的时间。

如何做一个服务器端验证谷歌的验证码 V2 or 隐形验证码 with Java?


我在用着org.json为此的图书馆。获取jar文件来自here http://central.maven.org/maven2/org/json/json/20140107/json-20140107.jar或阅读docs https://mvnrepository.com/artifact/org.json/json/20140107。将 jar 文件添加到您的项目并导入以下类。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
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",
                params = "secret=" + secretKey + "&response=" + response;

        HttpURLConnection http = (HttpURLConnection) new URL(url).openConnection();
        http.setDoOutput(true);
        http.setRequestMethod("POST");
        http.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded; charset=UTF-8");
        OutputStream out = http.getOutputStream();
        out.write(params.getBytes("UTF-8"));
        out.flush();
        out.close();

        InputStream res = http.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(res, "UTF-8"));

        StringBuilder sb = new StringBuilder();
        int cp;
        while ((cp = rd.read()) != -1) {
            sb.append((char) cp);
        }
        JSONObject json = new JSONObject(sb.toString());
        res.close();

        return json.getBoolean("success");
    } catch (Exception e) {
        //e.printStackTrace();
    }
    return false;
}

调用上面的方法如下图,

if(isCaptchaValid("enter_your_key_here", request.getParameter("g-recaptcha-response"))){
    //valid
}

希望这可以帮助。干杯!


EDIT:使用POST方法来验证信息的建议Google https://developers.google.com/recaptcha/docs/verify#api_request,更安全,但是如果您需要GET方法版本请参考编辑历史记录 https://stackoverflow.com/revisions/47622507/3.

不要编码params多变的。这样做您将始终得到以下响应。

{"error-codes":["missing-input-response","missing-input-secret"],"success":false}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何验证 reCAPTCHA V2 Java (Servlet) 的相关文章

  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 插入最大日期(独立于数据库)

    在我的本地设置中 我使用一个简单的 H2 数据库 托管 解决方案将有另一个 类似但不相同 数据库 我需要将最大可能日期插入到日期时间列中 我尝试使用 Instant MAX 但是 这会导致列中出现 169104626 12 11 20 08
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • MVC 模式中的验证层

    验证模型将使用的数据的最佳位置在哪里 例如 考虑登记表 我们有一些来自注册表的数据 那么验证这些数据的最佳位置在哪里 我们应该通过 if 语句或特殊的验证器类来检查每个数据 这意味着大量的编码 所以我想了解在哪里可以做到这一点 在控制器中
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • Jersey 客户端请求中未设置 Content-Length-Header

    我正在使用 Jersey Client 访问网络服务 如下所示 response r accept MediaType TEXT PLAIN TYPE header content length 0 post String class 其中
  • Angular 模板验证表单

    我正在研究表单验证 我正在使用模板驱动的验证表单 其编码如下 现在工作正常 但是当我尝试添加时 username ngModel and password ngModel 在创建验证类的输入中 它向我显示一个错误 也请找到该错误 div c
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • 通过 IO 了解 Haskell 中的纯函数

    给定一个 Haskellvalue 编辑每莱因 海因里希 https stackoverflow com users 2225384 rein henrichs s comment https stackoverflow com quest
  • 在播放结果上设置 HTTP 标头(如过期) - 以及如何处理 ETag?

    如何在 play 2 0 的结果对象中设置 Http 标头 我想设置缓存控制 过期 缓存控制 公开 最大年龄 2592000 检查 ET 标签并返回正确响应的最佳方法是什么 一直在看这里 但没有看到任何东西 http www playfra
  • 使用 Git 管理框架,忽略第一次拉取后对给定文件的更改

    我正在使用 git 来管理扩展的 CodeIgniter 框架 它是当前 CI 版本的克隆 带有额外的帮助程序 库等 我有许多网站都使用此框架 如果我添加新的帮助程序方法或修复一个网站中的错误 我希望能够轻松更新所有其他网站 而无需覆盖其任
  • 将一个结构深度复制到另一个结构

    我有一个struct其中包含字符串和指针 是否有任何库函数可用于进行深度复制struct进入另一个 我不想逐个字段进行复制 因为我拥有的结构非常大 glib 有没有什么函数可以做到这一点 不可以 通用函数无法知道结构体的结构 即仅在编译时可
  • 如何让 HTML 在另一个窗口或选项卡中打开超链接?

    这是 HTML 中的超链接行 a href http www starfall com Starfall a 因此 如果我单击 Starfall 我的浏览器 我使用的是 FireFox 将带我进入新页面 并且窗口的内容将发生变化 我想知道
  • Twitter Bootstrap 选项卡:内容窗格中的链接不起作用

    我这里有一个工作选项卡实例 并准备了一个 jsfiddle 不知何故 选项卡在这里无法正常工作 但链接问题仍然存在 http jsfiddle net Gyrga 6 http jsfiddle net Gyrga 6 选项卡窗格中的链接不
  • 二进制序列 x 位长的所有排列

    我想找到一种干净而聪明的方法 在 python 中 来查找 1 和 0 x 字符长的字符串的所有排列 理想情况下 这会很快并且不需要进行太多迭代 所以 对于 x 1 我想要 0 1 x 2 00 01 10 11 etc 现在我有这个 它很
  • 将一列拆分为多行

    谁能告诉我如何实现这个目标 在某些情况下 我的表中的列包含逗号分隔的值 如果是这样 我需要为这些值创建新行 此外 作为一个例子 一个表包含 1 行 4 列第 2 栏 第 3 栏 Col4 具有以下值 A 乙 C 分别为1 2 3 因此 Co
  • 用于重命名文件夹中的文件并再次命名的批处理文件

    恐怕这是一个有点过时的问题 但这里是 我有一个程序可以按顺序生成一些 RAW 文件 例如 示例 1 RAW示例 2 RAW 然后根据需要向数字添加额外的有效数字 例如 示例 10 RAW示例 200 RAW 我需要将这些文件名转换为数字 以
  • 在地图期间获取前一个元素的功能方法

    我有一个数组map超过 我需要将当前元素与前一个元素进行比较 我通过比较当前元素与前一个元素是否相同来检测id并根据这种情况做一些不同的事情 有没有一种纯粹的函数式方法可以在不进行索引数学的情况下做到这一点 items map item i
  • 如何在 SymPy 中创建一个参数本身就是随机变量的随机变量?

    我有一个随机变量 Y 其分布为泊松分布 参数本身就是随机变量 X 其分布为泊松分布 参数为 10 如何使用 SymPy 自动计算 X 和 Y 之间的协方差 代码 from sympy stats import x1 Poisson x1 3
  • 开玩笑:测试 window.location.reload

    我如何编写一个测试来确保该方法reloadFn实际上会重新加载窗口吗 我发现这个资源 https gist github com remarkablemark 5cb571a13a6635ab89cf2bb47dc004a3但我不清楚当窗口
  • 如何处理 JavaScript 中 setTimeout 的错误?

    简单的问题关于try catch对于函数在setTimeout try setTimeout function throw new Error error 300 catch e console log eeee console log e
  • 如何在 ListView 顶部插入小部件?

    简要说明 在我的所有代码示例中 您都会看到类似的内容material Widget而不是仅仅Widget 这是因为我喜欢这样命名我的导入 import package flutter material dart as material 我的
  • Fragment 切换期间 onResume() 的替代方案

    onResume 当我们在片段之间切换多次时 不会调用该方法 那么 有没有更好的方法来处理恢复操作呢 代码如下 Step 1 创建接口 public interface YourFragmentInterface void fragment
  • Angular4中的ActivatedRoute和ActivatedRouteSnapshot有什么区别

    有什么区别ActivatedRouteSnapshot and ActivatedRoute在 Angular 4 中 我的理解是ActivatedRouteSnapshot是一个孩子ActivatedRoute 意思是ActivatedR
  • 扩展中的延迟加载属性 (Swift)

    我知道 swift 不允许在扩展中声明存储的属性 出于同样的原因 延迟加载的属性也是被禁止的 我知道计算属性是一种选择 但我的任务应该只执行一次 是否有任何黑客 替代 被忽视的方法来模仿扩展中的惰性变量 Thanks 如果你不需要参考sel
  • requestWindowFeature(Window.FEATURE_NO_TITLE);给出例外

    import android content pm ActivityInfo import android os Bundle import android preference ListPreference import android
  • 只有我吗?我发现与 XPath 相比,LINQ to XML 有点麻烦

    我是一名 C 程序员 因此我无法利用 VB 中炫酷的 XML 语法 Dim itemList1 From item In rss
  • 如何验证 reCAPTCHA V2 Java (Servlet)

    这是一个问答风格的帖子 我将同时发布问题和答案 主要原因是我花了相当多的时间寻找验证 recaptcha V2 的最简单方法 因此 我将分享我的知识 以避免进一步浪费开发人员的时间 如何做一个服务器端验证谷歌的验证码 V2 or 隐形验证码