极验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统计字符串中字符出现的次数
