滑动验证的设计与实现J2EE
滑动验证的设计与实现J2EE
注:本博文为博主原创,转载请注明出处。
项目源码地址:https://github.com/zhangxy1035/Verify
本篇博文的主要目录如下:
一、项目简介
二、项目演示
2.1滑动验证演示
2.2验证码演示
三、项目构建
3.1滑动验证的项目构建
3,2验证码生成与实现
四、项目总结以及参考资料
一、项目简介
验证码在网页中随处可见,它主要是防止对某一个特定注册用户用特定程序进行暴力破解方式不断的登陆尝试。现在大多数的验证包括,字符验证码、文字验证等。在本博文中也实现了一般验证码的生成。但是本文的重点还是放在了基于极验插件实现的滑动验证功能。
二、项目演示
2.1滑动验证演示


2.2验证码验证

三、项目构建
3.1滑动验证项目构建
在滑动验证中,使用了第三方的插件极验(http://www.geetest.com/)。在极验的官方文档中介绍比较详细,什么样的后台,用什么样的代码,并且如何将这个插件集成在自己的项目中,在本节,我们将主要完成极验插件与Java Web的集成。
先来一张极验的原理图(图片来源:http://www.geetest.com/install/sections/idx-main-frame.html)

首先在极验平台上下载所需的平台插件。http://www.geetest.com/install/(以Java为例)。在认真阅读极验技术文档后,在https://github.com/GeeTeam/gt-java-sdk上下载插件。在插件中的主要类的代码如下。
GeetestLib.java(这个类是主要的类,必须在文件中包含)
GeetestConfig.java(基础的配置信息,比较重要的为id,key)
// 填入自己的captcha_id和private_key
private static final String geetest_id = "72ddccf637ee857411051fe81f66412e";
private static final String geetest_key = "fc84991f179bc1f9210556739f62c9ff";
StartCaptchaServlet.java(Servlet,这个类所在的包一定要和web.xml文件中保持一致)
web.xml(因为要融合到自己的项目中,所以在此之前我们需要新建一个java web项目,然后在web.xml文件中增加以下内容)
<servlet>
<servlet-name>StartCaptchaServlet</servlet-name>
<servlet-class>com.controller.login.StartCaptchaServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>StartCaptchaServlet</servlet-name>
<url-pattern>/login/pc-geetest/register</url-pattern>
</servlet-mapping>
其中上图中的关于servlet配置和普通的配置是一样的。只是在此需要注意<url-pattern>这个应该和自己的实际路径保持一致,并且要与前台页面中的也需要一致,前台页面中url为pc-geetest/register,这里却是/login/pc-geetest/register,这是由于,我本身的项目中用到了SpringMVC地址多映射了一层。
login.jsp
<script src="http://code.jquery.com/jquery-1.12.3.min.js"></script>
<!-- 引入封装了failback的接口--initGeetest -->
<script src="http://static.geetest.com/static/tools/gt.js"></script> <form id="loginForm" action="login.from" method="post">
<p>
<input type="text" id="username2" name="username" placeholder="用户名" class="form-control top">
<input type="password" id="password2" name="password" placeholder="密码" class="form-control top"> <div id="embed-captcha"></div>
<p id="wait" class="show">正在加载验证码......</p>
<p id="notice" class="hide">请先拖动验证码到相应位置</p> <br>
<button class="btn btn-lg btn-primary btn-block" id="embed-submit" onclick="doSubmit();">登陆</button>
</form> <script>
var handlerEmbed = function (captchaObj) {
$("#embed-submit").click(function (e) {
var validate = captchaObj.getValidate();
if (!validate) {
$("#notice")[].className = "show";
setTimeout(function () {
$("#notice")[].className = "hide";
}, );
e.preventDefault();
}
});
// 将验证码加到id为captcha的元素里,同时会有三个input的值:geetest_challenge, geetest_validate, geetest_seccode
captchaObj.appendTo("#embed-captcha");
captchaObj.onReady(function () {
$("#wait")[].className = "hide";
});
// 更多接口参考:http://www.geetest.com/install/sections/idx-client-sdk.html
};
$.ajax({
// 获取id,challenge,success(是否启用failback)
url: "pc-geetest/register?t=" + (new Date()).getTime(), // 加随机数防止缓存
type: "get",
dataType: "json",
success: function (data) {
// 使用initGeetest接口
// 参数1:配置参数
// 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件
initGeetest({
gt: data.gt,
challenge: data.challenge,
product: "embed", // 产品形式,包括:float,embed,popup。注意只对PC版验证码有效
offline: !data.success // 表示用户后台检测极验服务器是否宕机,一般不需要关注
// 更多配置参数请参见:http://www.geetest.com/install/sections/idx-client-sdk.html#config
}, handlerEmbed);
}
});
</script>
在上述代码中比较重要的是在网页中必须引入jquery,以及,极验平台提供的js,<script src="http://static.geetest.com/static/tools/gt.js"></script>这个js主要会去加载图片,以及根据验证的ID和key进行判断。这样一个项目就构建成功了。这个实现的主要功能为,通过将小的图片移动到缺口处,即可通过验证。
3.2一般验证码项目构建
首先在这个项目中实现的一般验证码为生成了从A-Za-z0-9之中的5个随机数,将此随机数在传递到前台进行,验证码的正确与否则是通过后台进行判断。主要的代码如下:
验证码生成
package com.ow.appmg.controller.login; import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Random; import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
@RequestMapping("/login")
public class GetCodeController { @RequestMapping("/getCode")
public void execute(
HttpServletResponse response,
HttpSession session) throws Exception{
//0.创建空白图片
BufferedImage image = new BufferedImage(,,BufferedImage.TYPE_INT_RGB);
//1.获取图片画笔
Graphics g = image.getGraphics();
Random r = new Random();
//2.设置画笔颜色
g.setColor(new Color(r.nextInt(), r.nextInt(), r.nextInt()));
//3.绘制矩形的背景
g.fillRect(, , , );
//4.调用自定义的方法,获取长度为5的字母数字组合的字符串
String number = getNumber();
//将图片字符存入session,用于验证码检查使用
session.setAttribute("scode", number);
g.setColor(new Color(,,));
g.setFont(new Font(null,Font.BOLD,));
//5.设置颜色字体后,绘制字符串
g.drawString(number, , );
//6.绘制8条干扰线
for(int i=;i<;i++){
g.setColor(new Color(r.nextInt(),r.nextInt(),r.nextInt(),r.nextInt()));
g.drawLine(r.nextInt(), r.nextInt(), r.nextInt(), r.nextInt());
}
response.setContentType("image/jpeg");
OutputStream ops = response.getOutputStream();
ImageIO.write(image, "jpeg", ops);
ops.close();
} private String getNumber(int size){
String str = "qwertyuioplkjhgfdsazxcvbnmABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String number = "";
Random r = new Random();
for(int i=;i<size;i++){
number+=str.charAt(r.nextInt(str.length()));
}
return number;
}
}
在上述代码中使用了SpringMVC,前台通过请求可以得到从后台生成的验证码。
前台页面login.jsp
<form id="loginForm" action="login.from" method="post">
<p class="text-muted text-center">
输入用户名和密码
</p>
<input type="text" name="username" placeholder="用户名" class="form-control top">
<input type="password" name="password" placeholder="密码" class="form-control top">
<input name="code" type="text" placeholder="验证码" class="form-control bottom">
<img src="getCode.from" alt="验证码" id="img" onclick="change()" />
<div class="checkbox">
<label>
<input type="checkbox"> 记住用户名和密码
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" onclick="doSubmit();">登陆</button>
</form>
<script type="text/javascript"> function doSubmit(){
//表单数据js检查
//提交表单
document.getElementById("loginForm").submit();
}
function change(){
document.getElementById("img").src='getCode.from?'+new Date().getTime();
}; </script>
在本页面中也实现了一个功能,点击验证码可以进行重新请求,重新生成。函数名称为change()函数。
四、项目总结以及参考资料
在本文中主要实现了滑动验证的功能,和一般验证码生成的功能,从本质上对于用户来说都是有区别的,滑动验证可以检测是否是用户行为从而进行验证,这一点无疑是比一般验证要安全很多。
参考的资料
极验(http://www.geetest.com/)技术文档
滑动验证的设计与实现J2EE的更多相关文章
- C# Selenium 破解腾讯滑动验证
什么是Selenium? WebDriver是主流Web应用自动化测试框架,具有清晰面向对象 API,能以最佳的方式与浏览器进行交互. 支持的浏览器: Mozilla Firefox Google C ...
- DRF 中使用 级验科技滑动验证
接口的login 登录 使用 Django 中的 auth 认证 因为之前合并了 django 的 用户表 创建的 用户 密码 会在内部进行加密 不知道加密方式所以要使用 authenticate 来 ...
- 滑动验证 和滑动图片验证JS
滑动验证 先放效果图 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- day 88 Vue学习之八geetest滑动验证
本节目录 一 geetest前端web中使用 二 xxx 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 geetest前端web中使用 下载gt文件,官网地址,下面我 ...
- Vue(7)- vue-cookies、极验滑动验证geetest、vue-router的导航守卫
一.vue-cookies 参考文档简书:https://www.jianshu.com/p/535b53989b39 参考文档npm:https://www.npmjs.com/package/vu ...
- vue-cookies、极验滑动验证geetest、vue-router的导航守卫
一 . vue-cookies 参考文档简书:https://www.jianshu.com/p/535b53989b39 参考文档npm:https://www.npmjs.com/package/ ...
- 原生JS实现滑动验证功能
一般很多网站都有滑动验证的功能,简单滑动验证的原理如下图所示: 主要理解思想就行 图中的代码可能和实际写的有所不同 HTML和CSS也可根据仔细的喜好就行修改 完整代码: <!DOCTYPE h ...
- day 86 Vue学习之八geetest滑动验证
Vue学习之八geetest滑动验证 本节目录 一 geetest前端web中使用 二 xxx 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 geetest前端web ...
- What?废柴, 模拟登陆,代码控制滑动验证真的很难吗?Are you kidding???
1.简介 在前边的python接口自动化的时候,我们由于博客园的登录机制的改变,没有用博客园的登录测试接口.那么博客园现在变成了滑动验证登录,而且现在绝大多数的登录都变成这种滑动验证和验证码的登录验证 ...
随机推荐
- HTML5学习笔记之History API
这系列文章主要是学习Html5相关的知识点,以学习API知识点为入口,由浅入深的引入实例,让大家一步一步的体会"h5"能够做什么,以及在实际项目中如何去合理的运用达到使用自如,完美 ...
- C#开发微信门户及应用(30)--消息的群发处理和预览功能
在很多场合下,我们可能需要利用微信公众号的优势,定期给指定用户群发送一些推广消息或者新闻内容,以便给关注客户一种经常更新公众号内容的感觉,同时也方便我们经常和用户进行互动.微信公众号的高级群发接口就是 ...
- C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息
在前面几篇文章中,逐步从原有微信的API封装的基础上过渡到微信应用平台管理系统里面,逐步介绍管理系统中的微信数据的界面设计,以及相关的处理操作过程的逻辑和代码,希望从更高一个层次,向大家介绍微信的应用 ...
- java重载与覆写
很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参 ...
- SSH远程会话管理工具 - screen使用教程
一.screen命令是什么? Screen是一个可以在多个进程之间多路复用一个物理终端的全屏窗口管理器.Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个s ...
- Windows10应用Docker部署DoNet Core
Win10和Mac稳定版的Docker发布了,之前看了下徐磊老师的几篇Docker4Dotnet的文章http://devopshub.cn/2016/07/08/docker4dotnet-1-ov ...
- 【原】Go语言及Web框架Beego环境无脑搭建
本文涉及软件均以截至到2013年10月12日的最新版本为准 1. 相关软件准备: 1) go1.2rc1.windows-386.msi,对应32位windows系统安装使用 下载地址: https: ...
- Webmin 安装 (centos7 rpm 方式)
网上有很多此类的教程,大多都很老了.这里记录下自己安装Webmin的过程. # 系统准备 > yum -y install perl perl-Net-SSLeay openssl perl-I ...
- CentOS7中安装Python3.5
1.下载 https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz 2.上传到服务器 3. 安装相关依赖 yum install gcc ope ...
- 解决NSTimer存在的内存泄漏的问题
创建定时器会在一定的间隔后执行某些操作,一般大家会这样创建定时器,这样创建的定时,self对定时器有个引用,定时器对self也有个引用,造成了循环引用,最终造成了内存泄漏,如果定时器在做下载的操作就会 ...