极验有一款行为验证的插件,其实就是个验证码插件,包括滑块和点选的验证方式,这里记录一下如何接入基于 jQuery + SpringMVC 的 Web 端项目
git clone https://github.com/GeeTeam/gt3-java-sdk.git
直接下载geetest_id
和 geetest_key
修改成自己的即可
geetest_id
,KEY 对应 geetest_key
doGet
演示初始化,doPost
演示接收验证请求private HashMap<String, String> getParams() {
String clientIp = URIUtil.getClientIp(request);
HashMap<String, String> params = Maps.newHashMap();
params.put("user_id", clientIp);
params.put("client_type", "web");
params.put("ip_address", clientIp);
return params;
}
getParams()
获取参数就是上一个函数public String generateCaptcha() {
// 初始化极验服务
GeetestLib lib = new GeetestLib(GeetestConfig.getGeetest_id(), GeetestConfig.getGeetest_key(), GeetestConfig.isnewfailback());
// 验证预处理
int status = lib.preProcess(getParams());
// 将服务状态存放到 Session 中,在第二步验证时会用到
request.getSession().setAttribute(lib.gtServerStatusSessionKey, status);
// 返回生成字串
return lib.getResponseStr();
}
request.getParameter()
可以直接使用,是因为我的 Service 集成了一个通用的父类,在里面直接注入了 HttpServletRequest
request
获取的参数都不是自定义的,由极验前端的 gt.js 内部提供saveMessage()
是验证成功后将当前参与验证的手机号和结果存储到 Redis 中,时效 5 分钟
TSharkException()
是自定义的异常处理,由 Controller 捕获后抛到前端弹出提示框告知用户public void checkCaptcha(String mobile) {
// 初始化极验服务
GeetestLib lib = new GeetestLib(GeetestConfig.getGeetest_id(), GeetestConfig.getGeetest_key(), GeetestConfig.isnewfailback());
// 接收前端参数,由前端 JS 内部封装处理
String challenge = request.getParameter(GeetestLib.fn_geetest_challenge);
String validate = request.getParameter(GeetestLib.fn_geetest_validate);
String seccode = request.getParameter(GeetestLib.fn_geetest_seccode);
// 取出第一步初始化验证时存储的服务状态
int status = (Integer) request.getSession().getAttribute(lib.gtServerStatusSessionKey);
int result = 0;
if (status == 1) {
// 服务器在线
result = lib.enhencedValidateRequest(challenge, validate, seccode, getParams());
} else {
// 服务器离线
result = lib.failbackValidateRequest(challenge, validate, seccode);
}
if (result == 1) {
// 保存验证信息
saveMessage(mobile, new MessageBean(mobile, result));
} else {
throw new TSharkException("行为验证失败,请检查使用环境");
}
}
RequestMethod.GET
和 RequestMethod.POST
来区分第一步验证和第二步验证SimpleActionHandler
是自定义封装的 Service 异常处理类
request
在继承的 AbstractBaseController
自定义父类中统一声明ResponseData
是自定义封装的返回结果类@Controller
@RequestMapping("/captcha")
public class CaptchaController extends AbstractBaseController {
@Autowired
private CaptchaServiceImpl captchaService;
@RequestMapping(value = "", method = RequestMethod.GET)
@ResponseBody
public ResponseData init() {
return new SimpleActionHandler(request) {
@Override
protected void doHandle(ResponseData responseData) throws Exception {
responseData.setData(captchaService.generateCaptcha());
}
}.handle();
}
@RequestMapping(value = "", method = RequestMethod.POST)
@ResponseBody
public ResponseData check(@RequestParam final String mobile) {
return new SimpleActionHandler(request) {
@Override
protected void doHandle(ResponseData responseData) throws Exception {
captchaService.checkCaptcha(mobile);
}
}.handle();
}
}
<script type="text/javascript" src="${ctx }/assets/plugins/jquery-1.11.1.min.js">script>
<script type="text/javascript" src="${ctx }/assets/plugins/geetest/gt.js">script>
div
用于放置初始化好的验证组件即可<section>
<label class="label">行为验证 <span class="text-danger pull-right">span>label>
<label class="input captcha">
<div class="captcha-tip">行为验证加载中div>
label>
section>
initGeetest()
,来自上文中的 gt.jscaptchaObj.appendTo()
将行为验证组件加入指定的页面容器中captchaObj.onReady()
中调用即可,这些官方文档都有介绍// 发起第一步验证
$.ajax({
url: '${ctx}/captcha',
type: 'GET',
dataType: 'json',
success: function (data) {
var result = JSON.parse(data.data)
// 初始化行为验证
initGeetest({
gt: result.gt,
challenge: result.challenge,
new_captcha: result.new_captcha,
offline: !result.success,
product: 'float',
width: '100%'
}, function (captchaObj) {
// 显示行为验证操作元素
captchaObj.appendTo($memberRegisterPanel.find('.captcha'))
captchaObj.onReady(function () {
getCurrentPanel().find('.captcha-tip').hide()
})
// .. 执行后续操作
})
}
})
mobile
是传入的手机号captchaObj.onSuccess(function () {
var result = captchaObj.getValidate()
// 发起之前可以先进行一些自定义验证,比如手机号是否填写,格式是否错误
// 如果自定义验证没有通过,可以使用 captchaObj.reset() 重置验证组件状态
// 发起二次验证
$.ajax({
url: '${ctx}/captcha',
type: 'POST',
data: {
mobile: mobileVal,
geetest_challenge: result.geetest_challenge,
geetest_validate: result.geetest_validate,
geetest_seccode: result.geetest_seccode
},
dataType: 'json',
success: function (data) {
if (!data.success) {
// 验证成功后的具体操作
}
}
})
})