极验GeeTest简单demo
概述
人机验证 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.git2 手动下载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,popup width: "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); //网站用户id param.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中获取userid String userid = (String)request.getSession().getAttribute("userid"); //自定义参数,可选择添加 HashMap<String, String> param = new HashMap<String, String>(); param.put("user_id", userid); //网站用户id param.put("client_type", "web"); //web:电脑上的浏览器;h5:手机上的浏览器,包括移动应用内完全内置的web_view;native:通过原生SDK植入APP应用的方式 param.put("ip_address", "127.0.0.1"); //传输用户请求验证时所携带的IP int 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项目供参考点击打开链接
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 统计字符串中每个字符出现的次数
- 下一篇: javaScript统计字符串中字符出现的次数