几天前看见JE上新闻上的Jquery插件中,有一个叫Ajax Fancy Captcha的验证码插件,虽然jcaptcha也还不错,但就因为一验证码莫明的多个组件出来,这并不是什么好事,更何况jcaptcha还依赖几个其它的组件。当然也有人说可以用recaptcha,虽然recaptcha没有用过,不过人家说了:reCAPTCHA is a Web service,我个人不太喜欢,内网根本不能用。因此一直在思考有没有办法用JS来代替。由于以前没有找到,所以也只有忍了,jcaptcha将就着用吧!但我发现Fancy时,我心动了,正好这几天有这个心情,决定花点时间把它应用到JAVA上来。首先到官方去看了一下,使用原理是:先从服务端获得一个0-4的数字(这个数字表示需要验证的是第几张图片),当把正确的图片拖到正确的位置时,生成一个隐藏的字段,这个字段的值就是这个随机数,当提交表单时,就把这个隐藏字段的值与服务端传过来的值比较,相等则通过。
由于官方的例子是采用PHP做的,本人从来没学过,也不打算学,所以不是很懂,看了个大概,基本算看懂了,但是采用JAVA来做,还是遇到了一些问题。
Fancy的文件主要有下面几个:
引用
-captcha
–imgs
–captcha.css
–jquery.captcha.js
–captcha.php
–iepngfix.htc
-latest-jquery
-latest-jquery-ui
-example.html
-readme.txt
由于官方的例子采用的PHP,所以里面含有PHP文件。实际上用JAVA时,有些文件是不需要的。
先从JSP说起,在JSP里需要做的事并不多,首先在头部引入声明:
...
<script type="text/javascript"
src="${pageContext.request.contextPath}/js/jquery.js"></script>
<script type="text/javascript"
src="${pageContext.request.contextPath}/js/jquery-ui-1.7.2.custom.min.js"></script>
<script type="text/javascript"
src="${pageContext.request.contextPath}/captcha/jquery.captcha.js"></script>
<script type="text/javascript" charset="utf-8">
$(function() {
$(".ajax-fc-container").captcha({formId: "myForm"});
});
</script>
<link rel="stylesheet" type="text/css"
href="${pageContext.request.contextPath}/captcha/captcha.css"></link>
...
需要注意的是要把form的ID做相应的修改,目录可以根据情况自己改变,当然jquery.captcha.js也要做相应的修改。经过上面声明以后,在相应的位置加入验证图片:
...
<div class="ajax-fc-container"></div>
...
JSP页面处理好以后,需要处理的就是JS代码了,JS代码其实很简单,就在jquery.captcha.js
文件内,这里需要注意两点:
一、验证的基本显示,例如把相应的英文改成相应的中文等,其实很简单,如:
...
var defaults = {
borderColor: "",
captchaDir: "captcha",
url: "./RandomCaptcha.action?getNumber",
formId: "myForm",
text: "<font size='2'>验证你是一个人,<br />拖动 <span>scissors</span> 进入圆圈内.</font>",
items: Array("pencil", "scissors", "clock", "heart", "note")
};
..
二、需要从服务端获得随机数字,这里需要用到AJAX请求,上面的URL就是相应的请求路径。getNumber表示请求执行此Action的getNumber方法,说到服务端,还真是麻烦,JAVA Web框架众多,但大多都复杂,就算古老的Struts,也依赖很多包,还要搞一堆配置,Struts2虽然功能强大,但用来照样有些复杂,更不用说其它的wicket,Tapestry了,就做一个简单的例子实在不想用那些复杂的框架,但是也不愿意直接用Servlet,还是Stripes好啊!功能强大,最让人称道的是它依赖的JAR特别少,只有一个common-logging文件,总算做了件好事。下面以Stripes为例,服务端的关键代码如下:
.....
@DontValidate
@HttpCache(allow = false)
public Resolution getNumber() {
return new StreamingResolution("text/plain") {
@Override
public void stream(HttpServletResponse response) throws Exception {
int captcha = new Random().nextInt(5);
response.getWriter().write(captcha + "");
}
};
}
...
如果没用过Stripes的也不要紧,上面代码的意思就是返回一个数字字符串,不过别看着简单,其中出了一个问题,本人花了很长时间才解决,那就是那个看起来有点奇怪的captcha+"",理论上说,可以直接写成:
response.getWriter().write(captcha );
但实际上传过去的是乱码,这就奇怪了,如果是中文,出现乱码可能是字节编码的问题,怎么数字也会是乱码?这个问题搞了很久,还是不知道原因,以前也用过这种方式传数据,没出现什么问题呀,难道是框架的问题!仔细看了下框架的源码,也没发现什么问题呀!就这一个问题让自己引申出了一系列的问题(JQuery,Stripes,Servlet甚至tomcat),差点去研究JavaScriptResolution去了。最后发现字符格式的问题,虽然以前也用过,但是从来没有试过只传整数的方式。所以不得已,后面加个空字符串,总算解决了问题。
后来还是花了点时间,试用了一下JavaScriptResolution,可能稍微要简单一点,需要修改两个地方:
一、返回StreamingResolution修改成JavaScriptResolution:
...
public Resolution getNumber() {
Random random = new Random();
int captcha = new Random().nextInt(5);
return new JavaScriptResolution(captcha);
}
....
二、由于是以javascript的格式返回的,所以JavaScriptResolution在返回的数据后面加了个";",于是相应的JS文件也要修改,原来的代码:
...
var rand = $.ajax({ url: options.url,async: false }).responseText;
...
修改成:
...
var rand = eval($.ajax({ url: options.url,async: false }).responseText);
...
这样看起来似乎稍微要简单一点,当然JavaScriptResolution还有一些比较强大的功能,尤其是处理复杂的数据时,非常有用。
通过上面几步,就可以看见基本的效果了:
在拖动图片到圆圈内时,Fancy会创建一个隐藏字段,代码如下:
...
$("#" + options.formId).append("<input type=\"hidden\" style=\"display: none;\" name=\"captcha\" value=\"" + rand + "\">");
...
这个字段的值就是从服务端传过来的数字,因此判断验证是否通过,只需要在服务端判断
字段captcha的值是否与刚才从服务端传过来的数字是否相等即可。
这样一个比较有创意的验证机制就做完啦!
- 大小: 7.7 KB
分享到:
相关推荐
**jQuery验证插件Ajax Fancy Captcha的使用(JAVA版本)** Ajax Fancy Captcha是一款功能强大的JavaScript验证插件,它结合了美观与实用,为网站提供了一种有效的防止机器人自动提交表单的方式。这款插件主要面向...
Ajax-Fancy-CAPTCHA-PHP 是一个创新的验证码解决方案,它结合了Ajax技术和JavaScript,为用户提供了一种互动且趣味性的验证体验。这个项目的核心目的是在防止自动化机器人和恶意攻击的同时,提供一个用户友好的界面...
**AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。在本示例中,我们将深入探讨如何利用jQuery库实现AJAX功能,以及与服务器端PHP脚本的交互。** **一、...
《I Wanna be the Fancy》是一款基于经典游戏"I Wanna"系列的独立制作游戏,版本为ver1.02。这款游戏以其高难度和独特的关卡设计深受玩家喜爱,是平台跳跃类游戏中颇具挑战性的一款。在尝试运行《I Wanna be the ...
"Fancy Upload + ASP.NET 大文件上载"是解决这一问题的一种方案,它结合了Fancy Upload组件与ASP.NET技术,提供了一种高效且用户友好的文件上传体验。 Fancy Upload是一个JavaScript库,设计用于创建吸引人的、具有...
标题"Fancy Skies [v1.1].zip"暗示我们正在处理一个游戏资源包,可能是为Minecraft这样的沙盒游戏设计的。版本号"v1.1"表明这是该资源包的一个更新版本,通常意味着修复了错误或添加了新的特性。 在描述中,同样...
Fancy Footwork
《fancy用法点津》 在英语词汇中,“fancy”是一个非常多功能的单词,它可以在不同的语境下作为动词、名词或形容词使用,具有丰富的含义和表达方式。下面我们将深入探讨“fancy”的各种用法,并通过实例来帮助理解...
Fancybuttons Icons, Borders, Radius ... for Android buttons Overview Demo Application : Download APK Features Border (stroke, radius, color) Background (normal, focus) Icon (Drawable, font icon)...
使用「Fancy Widget」馬上讓你的Andorid手機擁有類似HTC Sense的氣象時鐘。
在IT行业中,Ajax(Asynchronous JavaScript and XML)和FancyUpload是两种常见的文件上传技术,它们都致力于提供更优秀的用户体验,尤其是对于Web应用程序中的文件上传功能。Ajax上传允许用户在不刷新整个页面的...
**JS+CSS Fancy Menu**是一种使用JavaScript和CSS技术创建的高级导航菜单,它以其流畅的交互性和独特的视觉效果而受到广泛关注。在网页设计中,菜单是用户与网站交互的重要元素,一个美观且易于使用的菜单可以极大地...
当前版本:3.1.1 软件语言:中文 ...华丽应用切换Fancy Switcher是一款增强型的应用快速切换和管理工具,它可以通过手势轻松调出最近使用的App。支持特效和风格包,并可自定义各项视觉元素。相当的漂亮!
【标题】"变态玛丽FANCY阿鑫修改版"是一个基于经典游戏《超级玛丽》的非官方修改版本,由玩家FANCY阿鑫进行了一系列创新和调整,为玩家带来全新的游戏体验。这种修改版通常包含了对原游戏关卡设计、角色能力、图形...
《爱上表单设计Fancy-Form-Design》是一本专注于前端开发中表单设计的专业书籍。这本书虽然篇幅不长,但内容精炼且全面,涵盖了表单设计的各个环节,对于前端开发者,尤其是对用户体验有高要求的设计师来说,是一本...
《变态玛丽fancy修改版及源码》是一个独特的游戏作品,源自经典的马里奥游戏,但经过FANCY的创新性改动,呈现出全新的视觉风格和游戏体验。此压缩包包含了两个主要内容:游戏本身和源代码。 首先,让我们来探讨一下...
本文将深入探讨Delphi中的一个特定控件——DS_FANCY按钮类。 DS_FANCY按钮类是Delphi控件库中的一个自定义扩展,为开发者提供了超越标准TButton控件的功能和视觉效果。这个自定义按钮控件通常会提供更加美观的外观...
在"描述"中提到的"fancy form for your web applications.",意味着这个压缩包可能包含了一些高级的表单设计,如使用CSS样式美化表单元素、JavaScript验证用户输入,或者使用AJAX实现无刷新提交。这样的设计可以提高...