极客验证官方demo构建使用及代码分析

#什么是极客验证?

官方定义:极验验证是一种在计算机领域用于区分自然人和机器人的,通过简单集成的方式,为开发者提供安全、便捷的云端验证服务。

#使用命令从github上获取:

git clone https://github.com/GeeTeam/gt3-java-sdk.git 

#使用idea搭建sdk工程:

>>导入已有的工程:

>>选择从git克隆的项目

>>选择Project Structure 设置

>>选择工程gt3-java-sdk

>>选择之后显示 gt3-java-sdk:war explorded, 表示成功

>>配置tomcat,加刚才的项目加到tomcat中,选择Edit Configurations > + > Tomcat Server > Local

>>取个名字:

>>选择Deployment -> Artifact

>>加好之后可以,也可以给你的项目加一个访问空间,访问项目 /login.jsp

#极客验证后台逻辑梳理:

step1: 该段script位于主页body里面,也就是说在页面加载完毕后,会加载该部分内容,这个时候我们发现进行了ajax请求后台。

<script>
    var handler1 = function (captchaObj) {
        $("#submit1").click(function (e) {
            var result = captchaObj.getValidate();
            if (!result) {
                $("#notice1").show();
                setTimeout(function () {
                    $("#notice1").hide();
                }, 2000);
                e.preventDefault();
            }
        });
        // 将验证码加到id为captcha的元素里,同时会有三个input的值用于表单提交
        captchaObj.appendTo("#captcha1");
        captchaObj.onReady(function () {
            $("#wait1").hide();
        });
        // 更多接口参考:http://www.geetest.com/install/sections/idx-client-sdk.html
    };
    $.ajax({
        url: "gt/register1?t=" + (new Date()).getTime(), // 加随机数防止缓存
        type: "get",
        dataType: "json",
        success: function (data) {
            // 调用 initGeetest 初始化参数
            // 参数1:配置参数
            // 参数2:回调,回调的第一个参数验证码对象,之后可以使用它调用相应的接口
            initGeetest({
                gt: data.gt,
                challenge: data.challenge,
                new_captcha: data.new_captcha, // 用于宕机时表示是新验证码的宕机
                offline: !data.success, // 表示用户后台检测极验服务器是否宕机,一般不需要关注
                product: "float", // 产品形式,包括:float,popup
                width: "100%"
                // 更多配置参数请参见:http://www.geetest.com/install/sections/idx-client-sdk.html#config
            }, handler1);
        }
    });
</script>

step2: 观察web.xml配置,我们找到请求的类demo.demo1.StartCaptchaServlet

step3: demo.demo1.StartCaptchaServlet 从该类可以看出,该次请求主要做了用户验证预处理。主要根据在官方网站注册得到的captcha_id和private_key进行验证预处理

GeetestLib gtSdk = new GeetestLib(GeetestConfig.getGeetest_id(), GeetestConfig.getGeetest_key(),
                GeetestConfig.isnewfailback());

        String resStr = "{}";

        //自定义userid
        String userid = "test";

        //进行验证预处理
        int gtServerStatus = gtSdk.preProcess(userid);

        //将服务器状态设置到session中
        request.getSession().setAttribute(gtSdk.gtServerStatusSessionKey, gtServerStatus);
        //将userid设置到session中
        request.getSession().setAttribute("userid", userid);

step4: 首先通过userid进行服务注册,并将注册结果返回

    /**
     * 验证初始化预处理
     *
     * @return 1表示初始化成功,0表示初始化失败
     */
    public int preProcess() {

        if (registerChallenge() != 1) {

            this.responseStr = this.getFailPreProcessRes();
            return 0;

        }

        return 1;

    }

step5: 该处使用HttpURLConnection 连接服务器得到服务器返回的结果,并且更新 challenge

URL getUrl = new URL(URL);
        HttpURLConnection connection = (HttpURLConnection) getUrl
                .openConnection();

        connection.setConnectTimeout(2000);// 设置连接主机超时(单位:毫秒)
        connection.setReadTimeout(2000);// 设置从主机读取数据超时(单位:毫秒)

        // 建立与服务器的连接,并未发送数据
        connection.connect();

        if (connection.getResponseCode() == 200) {
            // 发送数据到服务器并使用Reader读取返回的数据
            StringBuffer sBuffer = new StringBuffer();

            InputStream inStream = null;
            byte[] buf = new byte[1024];
            inStream = connection.getInputStream();
            for (int n; (n = inStream.read(buf)) != -1;) {
                sBuffer.append(new String(buf, 0, n, "UTF-8"));
            }
            inStream.close();
            connection.disconnect();// 断开连接

step6: 并且在成功的时候会将返回的字符串标准化然后返回到前台

/**
     * 预处理成功后的标准串
     *
     */
    private String getSuccessPreProcessRes(String challenge) {

        gtlog("challenge:" + challenge);

        JSONObject jsonObject = new JSONObject();
        try {

            jsonObject.put("success", 1);
            jsonObject.put("gt", this.captchaId);
            jsonObject.put("challenge", challenge);

        } catch (JSONException e) {

            gtlog("json dumps error");

        }

        return jsonObject.toString();

    }
resStr = gtSdk.getResponseStr();

        PrintWriter out = response.getWriter();
        out.println(resStr);

step7: 使用返回的结果进行参数初始化(这儿进行初始,会在gt.js里面再次请求服务器,进行验证图片相关的请求)

 initGeetest({
                gt: data.gt,
                challenge: data.challenge,
                new_captcha: data.new_captcha, // 用于宕机时表示是新验证码的宕机
                offline: !data.success, // 表示用户后台检测极验服务器是否宕机,一般不需要关注
                product: "float", // 产品形式,包括:float,popup
                width: "100%"
                // 更多配置参数请参见:http://www.geetest.com/install/sections/idx-client-sdk.html#config
            }, handler1);

step: js还很薄弱,后面深入了解了,该处可以用来提升js实战。

时间: 2024-10-22 10:32:55

极客验证官方demo构建使用及代码分析的相关文章

[极客大挑战 2019]PHP CTF题解与分析

知识点 php序列化与反序列化 序列化:函数为serialize(),把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等 反序列化:函数为unserialize(),将字符串转换成变量或对象的过程 常用的魔术方法: __construct():创建对象时初始化,当一个对象创建时被调用 __wakeup() 使用unserialize时触发 __sleep() 使用serialize时触发 __destruction():结束时销毁对象,当一个对象销毁时被调用 private

jQuery animate方法开发极客标签Logo动画融合效果

在线演示 本地下载 jQuery的animate方法基础使用,演示如何生成一个jQuery animate方法开发极客标签Logo动画融合效果 相关代码录播:jQuery animate方法开发极客标签Logo动画融合效果

【云+社区极客说】新一代大数据技术:构建PB级云端数仓实践

本文来自腾讯云技术沙龙,本次沙龙主题为构建PB级云端数仓实践 在现代社会中,随着4G和光纤网络的普及.智能终端更清晰的摄像头和更灵敏的传感器.物联网设备入网等等而产生的数据,导致了PB级储存的需求加大. 但数据保留下来并不代表它真的具有利用价值,曾经保存的几TB的日志,要么用来做做最简单的加减乘除统计,要么就在日后出现问题了,扒出日志堆找证据.你的影视库里面可以下载储存成千上万部影片,但不代表你真的能全部看完. 如何将手里现有的数据变得更具有价值?一些营销云已经可以做到毫秒级响应做到精准投放广告

【网易官方】极客战记(codecombat)攻略-森林-If 的盛宴

关卡连接:https://codecombat.163.com/play/level/if-stravaganza 免费试玩:https://codecombat.163.com/play 食人魔从四面八方围攻!等待时机,攻击突围! 简介 使用 if 语句判别周围是否存在食人魔,以此进行防御! 没有敌人时不要攻击!别把英雄弄糊涂了. 默认代码 # 在食人魔的营地中打败它们! while True: enemy = hero.findNearestEnemy() if enemy: # 使用一个

【网易官方】极客战记(codecombat)攻略-森林-野餐毁灭者

关卡连接:https://codecombat.163.com/play/level/picnic-buster 免费试玩:https://codecombat.163.com/play 从巡逻的食人魔手中保护野餐者. 简介 使用 if 语句保护露营的人们,在食人魔进攻时挺身而出. if 语句对程序员来说至关重要,它们看起来像这样: enemy = hero.findNearestEnemy() if enemy: hero.attack(enemy) 默认代码 # 记得敌人可能还不存在. wh

【网易官方】极客战记(codecombat)攻略-森林-巡逻兵克星A

关卡连接:https://codecombat.163.com/play/level/patrol-buster-a 免费试玩:https://codecombat.163.com/play 使用最新的目标选择确定技能击退食人魔巡逻兵. 简介 您现在可以访问强大的 if 语句. 请在右下角中查看 Programmaticon II 的工具栏以获取更多信息. if 语句是程序员的基本工具. 通过键入来创建它们: enemy = hero.findNearestEnemy() if enemy: h

【网易官方】极客战记(codecombat)攻略-森林-村庄守护者

关卡连接:https://codecombat.163.com/play/level/village-guard 免费试玩:https://codecombat.163.com/play 从食人魔的劫掠中保护村庄 简介 在村庄的入口处巡逻,使用 if 语句检查是否有敌人. 默认代码 # 在村口巡逻. # 如果发现敌人,就攻击它. while True: hero.moveXY(35, 34) leftEnemy = hero.findNearestEnemy() if leftEnemy: he

【网易官方】极客战记(codecombat)攻略-森林-食人魔营地-ogre-encampment

关卡连接:https://codecombat.163.com/play/level/ogre-encampment 免费试玩:https://codecombat.163.com/play 从食人魔营地夺回被盗的财宝 简介 如果有敌人,攻击之.否则,攻击宝箱. 默认代码 # 如果有敌人,那么就攻击它 # 否则,攻击宝箱 while True: # 使用if/else语句 hero.attack("Chest") 概览 这关你需要同时用上 if 和 else .记得 else 对应的代

【网易官方】极客战记(codecombat)攻略-森林-森林劈斩者woodland-cleaver

关卡连接:https://codecombat.163.com/play/level/woodland-cleaver 免费试玩:https://codecombat.163.com/play 使用新的 cleave 能力抵御食人魔矮人 简介 你有一把新的剑,它有一个方法 cleave() : 你还有一块新的腕表,它有一个方法 isReady() cleave() 是攻击周围所有敌人的特殊攻击技能,但两次使用之间会有冷却时间. 在你使用 cleave() 前, 你得检查一下它是否准备好了: if