可以去极验的官网下载demo:极验官网
进入官网之后点击技术文档:技术文档,之后点击行为验证的快速开始
github上下载极验的demo:git clone https://github.com/GeeTeam/gt3-java-sdk.git
极验的流程图如下:
1.首先上pom文件引入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.4</version>
</dependency>
</dependencies>
2.GeetestConfig类的配置
// 填入自己的captcha_id和private_key
private static final String geetest_id = "002bc30ff1eef93e912f45814945e752";
private static final String geetest_key = "4193a0e3247b82a26f563d595c447b1a";
private static final boolean newfailback = true;
public static final String getGeetest_id() {
return geetest_id;
}
public static final String getGeetest_key() {
return geetest_key;
}
public static final boolean isnewfailback() {
return newfailback;
}
3.GeetestLib类(SDK)这个类不用我们去操心,这是极验官方提供的sdk工具给我们
4.PublicController(第一次验证需要获取参数的类,之前用的Servlet,我改成了一个接口)
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import cn.jsonXxxx.jyTest.config.GeetestConfig;
import cn.jsonXxxx.jyTest.sdk.GeetestLib;
import cn.jsonXxxx.jyTest.util.IpUtil;
@Controller
@RequestMapping("/public")
public class PublicController {
@RequestMapping(value = "/register", method = RequestMethod.GET)
@ResponseBody
public void register(HttpServletRequest request, HttpServletResponse response) throws IOException {
GeetestLib gtSdk = new GeetestLib(GeetestConfig.getGeetest_id(), GeetestConfig.getGeetest_key(),
GeetestConfig.isnewfailback());
String resStr = "{}";
// 自定义userid
HttpSession session = request.getSession();
// User baseUser = (User) session.getAttribute("baseUser");
// String userid = null;
// if (Objects.nonNull(baseUser)) {
// userid = baseUser.getUserName();
// }
// 自定义参数,可选择添加
HashMap<String, String> param = new HashMap<String, String>();
param.put("user_id", "username"); // 网站用户id
param.put("ip_address", IpUtil.getIpAddr(request)); // 传输用户请求验证时所携带的IP
// 进行验证预处理
int gtServerStatus = gtSdk.preProcess(param);
// 将服务器状态设置到session中
request.getSession().setAttribute(gtSdk.gtServerStatusSessionKey, gtServerStatus);
// 将userid设置到session中
request.getSession().setAttribute("userid", "username");
resStr = gtSdk.getResponseStr();
PrintWriter out = response.getWriter();
out.println(resStr);
}
}
5.Verification二次验证的工具类, 抽取出来,可以再任何地方使用(注册,登陆,修改密码等)
import java.util.HashMap;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.jsonXxxx.jyTest.config.GeetestConfig;
import cn.jsonXxxx.jyTest.sdk.GeetestLib;
/**
*
* @author jsonXxxx 极验第二次验证工具类
*/
public class Verification {
public final static int SUCCESS = 1;
public final static int FAIL = 0;
public static int verification(HttpServletRequest request, HttpServletResponse response) {
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状态
Optional<Object> status = Optional.ofNullable(request).map(HttpServletRequest::getSession)
.map(session -> session.getAttribute(gtSdk.gtServerStatusSessionKey));
int gt_server_status_code = status.isPresent() ? (int) status.get() : 0;
// 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("ip_address", IpUtil.getIpAddr(request)); // 传输用户请求验证时所携带的IP
int gtResult = 0;
if (gt_server_status_code == 1) {
// gt-server正常,向gt-server进行二次验证
gtResult = gtSdk.enhencedValidateRequest(challenge, validate, seccode, param);
} else {
// gt-server非正常情况下,进行failback模式验证
gtResult = gtSdk.failbackValidateRequest(challenge, validate, seccode);
}
return gtResult;
}
}
6.LoiginController测试接口
@RequestMapping("/login")
@Controller
public class LoginController {
@RequestMapping("/test")
@ResponseBody
public void LoginTest(HttpServletRequest request, HttpServletResponse response) {
// 返回的状态
//修改成自己的业务
int verification = Verification.verification(request, response);
if (verification != Verification.SUCCESS) {
return;
}
}
}
到此一次极验就算是完成了,附上完整的demo代码需要的同学可以去下载:https://github.com/zaizhongjian/jyTest
下载demo,启动之后,访问localhost:8080/login.html