概述
人机验证 3.0 解决方案(基于生物行为与人工智能)
2012 年极验将人机验证从1.0时代推动到了 2.0 时代。在 5 年时间中,超过千亿次数据学习与优化,极验利用三角防护理论和 AI 智能决策引擎,全面更新安全架构。2017 年,正式推出 Test-button 人机验证 3.0 时代解决方案。
2012 年极验将人机验证从1.0时代推动到了 2.0 时代。在 5 年时间中,超过千亿次数据学习与优化,极验利用三角防护理论和 AI 智能决策引擎,全面更新安全架构。2017 年,正式推出 Test-button 人机验证 3.0 时代解决方案。
安装
1 使用命令从Github获取
git clone https://github.com/GeeTeam/gt3-java-sdk.git
git clone https://github.com/GeeTeam/gt3-java-sdk.git
2 手动下载
https://github.com/GeeTeam/gt3-java-sdk/archive/master.zip
使用
新建Web Project项目取名GeeTest,将解压文件的WebContent目录下的文件粘贴至项目的WebRoot目录下,将解压文件的src目录下的文件粘贴至项目的src目录下。最后的项目结构如下图:
导出
右键项目Export导出WAR文件至Tomcat webapps目录下启动Tomcat,访问http://localhost:8080/GeeTest/login.jsp即可看到如下demo
源码分析(以demo2为例)
login.jsp
$.ajax({url: "gt/register2?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: "popup", // 产品形式,包括:float,popupwidth: "100%"// 更多配置参数请参见:http://www.geetest.com/install/sections/idx-client-sdk.html#config}, handler2);}
点击按钮使用GET方式向服务器请求验证码的相关数据 请求的服务器StartCaptchaServlet.java servlet代码如下:
package demo.demo2;import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.UUID;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import sdk.GeetestLib;/*** 使用Get的方式返回challenge和capthca_id,此方式以实现前后端完全分离的开发模式**/
public class StartCaptchaServlet extends HttpServlet {private static final long serialVersionUID = 3638755752704977621L;protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {GeetestLib gtSdk = new GeetestLib(GeetestConfig.getGeetest_id(), GeetestConfig.getGeetest_key(), GeetestConfig.isnewfailback());String resStr = "{}";//自定义userid
// String userid = "test";String userid=UUID.randomUUID().toString();//自定义参数,可选择添加HashMap<String, String> param = new HashMap<String, String>(); param.put("user_id", userid); //网站用户idparam.put("client_type", "web"); //web:电脑上的浏览器;h5:手机上的浏览器,包括移动应用内完全内置的web_view;native:通过原生SDK植入APP应用的方式param.put("ip_address", "127.0.0.1"); //传输用户请求验证时所携带的IP//进行验证预处理int gtServerStatus = gtSdk.preProcess(param);//将服务器状态设置到session中request.getSession().setAttribute(gtSdk.gtServerStatusSessionKey, gtServerStatus);//将userid设置到session中request.getSession().setAttribute("userid", userid);resStr = gtSdk.getResponseStr();PrintWriter out = response.getWriter();out.println(resStr);}
}
该servlet使用session来标识请求者的ID(所以得使用jsp来编写前端,当然,也可以将该标识符放到Header里,就可以使用HTML来编写前端页面了) 之后前端使用POST发送用户滑动图片验证的相关信息到服务器验证信息
login.jsp:
else {$.ajax({url: 'gt/ajax-validate2',type: 'POST',dataType: 'json',data: {username: $('#username2').val(),password: $('#password2').val(),geetest_challenge: result.geetest_challenge,geetest_validate: result.geetest_validate,geetest_seccode: result.geetest_seccode},success: function (data) {if (data.status === 'success') {alert('登录成功');} else if (data.status === 'fail') {alert('登录失败');}}
请求的服务器VerifyLoginServlet.java servlet代码如下 package demo.demo2;import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.json.JSONException;
import org.json.JSONObject;import sdk.GeetestLib;/*** 使用post方式,返回验证结果, request表单中必须包含challenge, validate, seccode*/
public class VerifyLoginServlet extends HttpServlet {private static final long serialVersionUID = -7948297725267896627L;protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {GeetestLib gtSdk = new GeetestLib(GeetestConfig.getGeetest_id(), GeetestConfig.getGeetest_key(), GeetestConfig.isnewfailback());String challenge = request.getParameter(GeetestLib.fn_geetest_challenge);String validate = request.getParameter(GeetestLib.fn_geetest_validate);String seccode = request.getParameter(GeetestLib.fn_geetest_seccode);//从session中获取gt-server状态int gt_server_status_code = (Integer) request.getSession().getAttribute(gtSdk.gtServerStatusSessionKey);//从session中获取useridString userid = (String)request.getSession().getAttribute("userid");//自定义参数,可选择添加HashMap<String, String> param = new HashMap<String, String>(); param.put("user_id", userid); //网站用户idparam.put("client_type", "web"); //web:电脑上的浏览器;h5:手机上的浏览器,包括移动应用内完全内置的web_view;native:通过原生SDK植入APP应用的方式param.put("ip_address", "127.0.0.1"); //传输用户请求验证时所携带的IPint gtResult = 0;if (gt_server_status_code == 1) {//gt-server正常,向gt-server进行二次验证gtResult = gtSdk.enhencedValidateRequest(challenge, validate, seccode, param);System.out.println(gtResult);} else {// gt-server非正常情况下,进行failback模式验证System.out.println("failback:use your own server captcha validate");gtResult = gtSdk.failbackValidateRequest(challenge, validate, seccode);System.out.println(gtResult);}if (gtResult == 1) {// 验证成功PrintWriter out = response.getWriter();JSONObject data = new JSONObject();try {data.put("status", "success");data.put("version", gtSdk.getVersionInfo());} catch (JSONException e) {e.printStackTrace();}out.println(data.toString());}else {// 验证失败JSONObject data = new JSONObject();try {data.put("status", "fail");data.put("version", gtSdk.getVersionInfo());} catch (JSONException e) {e.printStackTrace();}PrintWriter out = response.getWriter();out.println(data.toString());}}
}
服务器进行验证后返回gtResult 参数来表示是否成功,开发者可以在这个servlet里添加自己的验证用户信息代码一并进行验证
最后放上笔者自己的war项目供参考 点击打开链接