首页 > 使用JavaScript,如何生成汉字验证码?

使用JavaScript,如何生成汉字验证码?

我现在有一个需求,要生成汉字的验证码,如何用js随机生成汉字?


nodejs不懂怎样生成图片,说下思路。
分解下需求,楼主要一个验证码程序,既然是验证码,就应该得是图片,而且图片的url和参数不能和汉字有任何关联,因为有关联就能被机器人轻易的抓到链接从而破解,综上楼主需要的接口是:
1.一个随机生成汉字图片的接口 /gen_img.js =>返回 {"imgcode":"xxx","img":"base64"}
百度了一下貌似没有直接生成汉字图片的nodejs库,那就准备足够的单个汉字图片,存到服务器上,并且给每张图片一个id,录入一到张对应表里面,方便我们找对应关系。
/web/data/1.jpg 中
/web/data/2.jpg 文
...
/web/data/n.jpg 字
接口拿到对应表之后就可以轻易的生成n个不重复的随机数和n个汉字,由这n个随机数取n张图片,合成一张图片。因为图片不会太大,可以直接编码成base64(又或者放到网站的public目录下,接口就直接返回一个url)。随机再生成一个imgcode,给这个图片一个code,用来给下一步做验证。这个code和上面生成的n个汉字需要在会话中保存下来

2.根据图片id+输入汉字验证输入的正确性的接口 /verify.js?key=xxx&imgcode=xxx
从会话里拿出code和汉字,和传过来的code+key对比

合成图片可以使用 GraphicsMagick http://aheckmann.github.io/gm/docs.html


验证码 用js来写,意义不大, 关掉了js不就over了?


解:
根据题目要求,产生随机汉字,我们只学过随机数字,没有见过随机汉字,
但二者是一个映射的关系,故必须找到汉字与数字的关系。
根据此思路,根据网上百度到的正则表达式匹配中文的答案[\u4e00-\u9fa5]
然后再

parseInt("4E00",16)
>> 19968

parseInt("9FA5",16)
>> 40869

40869-19968
>> 20901

于是就有了下面的代码

randomHz=function(){
    eval( "var word=" +  '"\\u' + (Math.round(Math.random() * 20901) + 19968).toString(16)+'"');
    return word;
}
for(i=0;i<100;i++){
    console.log(randomHz());
}

解毕

ps:
这只是理论解答,因为中文字符有近2w个,大家都是用的拼音,而不是五笔,人家根本打不出来的好不好。
你用来产生随机中文字符,必须是大家喜闻乐见的常用汉字!
所以你还是要回归最原始的办法——建立一个数组,放几十个或者几百个常见的字,然后随机产生一个随机数做索引访问即可。

【热门文章】
【热门文章】