simpleCaptcha 语音实现及其扩展
在我了解的的Captcha中 有两个框架一个JCaptcha和simpleCaptcha都可以去实现语音验证码,JCaptcha比较的麻烦,所以我对语音验证码实现用比较简单的simpleCaptcha
多的不说了直接来
准备工作
- 首先下载架包,这个架包在maven仓库是找不到的,只能从官网下载,官网地址链接: http://simplecaptcha.sourceforge.net .
- 然后将复制jar导入到项目中WEB-INF/lib (这个路径就根据你的项目路径lib配置,maven项目呢就maven集成就行)
实现
simpleCaptcha 提供了简单实现servlet 实现 ,直接在web.xml配置就行
<servlet>
<servlet-name>AudioCaptcha</servlet-name>
<servlet-class>nl.captcha.servlet.AudioCaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AudioCaptcha</servlet-name>
<url-pattern>/audio.wav</url-pattern>
</servlet-mapping>
> simpleCaptcha 提供四个实现 (nl.captcha.servlet)
>1.StickyCaptchaServlet 随机生成5个字符(数字+字母) 结果会放在session中存储,刷新页面不会改变值,继承simpleCaptchaServlet。
>2.ChineseCaptchaServlet 随机生成5个中文字符,结果也会放入session中存储,刷新页面不会改变值,继承simpleCaptchaServlet。
>3.AudioCaptcha 默认生成5个字符 语音验证码
>4.SimpleCaptchaServlet 随机数生成5个字符(数字+字母)放在page中,页面刷新会重新生成。
可以搜索
CaptchaServlet
进行源码搜索查看
然后到这里基本的结束啦 … 简单吧
实现扩展
我们稍稍改动哦 将servlet 实现 通过spring web工程实现
@RequestMapping("/doAudioCaptcha.wav")
@ResponseBody
public void doAudioCaptcha() {
AudioCaptcha ac = (new AudioCaptcha.Builder()).addAnswer().addVoice().addNoise().build();
String answer = ac.getAnswer();
session.setAttribute("audioCaptcha", ac);
//IO流
Sample sample = ac.getChallenge();
response.setHeader("Cache-Control", "private,no-cache,no-store");
response.setContentType("audio/wave");
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
AudioSystem.write(sample.getAudioInputStream(), AudioFileFormat.Type.WAVE, baos);
response.setContentLength(baos.size());
OutputStream os = response.getOutputStream();
os.write(baos.toByteArray());
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
然后得到结果跟servlet 的一样
AudioCaptcha ac = (new AudioCaptcha.Builder()).addAnswer().addVoice().addNoise().build();
这个方法直接就实现啦验证码 AudioCaptcha (语音)和 Captcha(文字)
//AudioCaptcha
- build() 构建
- addAnswer() 文字
- addVoice() 音频
- addNoise() 噪音
//Captcha
- addBackground() 背景
- build() 构建
- addText() 文本
- gimp() 花边
- addBorder()线条
这里只是扩展源码一些方法,讲了些废话
接着走,语音提供了AudioCaptcha addAnswer() 然后查看源码
addAnswer是可以传递一个接口 TextProducer 提供默认实现
这里我们就可以重写 DefaultTextProducer 这个类 ,改变DEFAULT_LENGTH 和 DEFAULT_CHARS 进行自定义
@RequestMapping("/doAudioCaptcha.wav")
@ResponseBody
public void doAudioCaptcha() {
//实现自定义字符传入
SampleDefaultTextProducer defaultTextProducer=new SampleDefaultTextProducer("12345");
//实现自定义音频来源
SamplRandomVoiceProducer samplRandomVoiceProducer=new SamplRandomVoiceProducer();
//实现自定义噪音
RandomNoiseProducer randomNoiseProducer=new RandomNoiseProducer();
AudioCaptcha ac = (new AudioCaptcha.Builder()).addAnswer(defaultTextProducer).addVoice(samplRandomVoiceProducer).addNoise().build();
String answer = ac.getAnswer();
System.out.println("------------------------------answer---------------------------:"+answer);
session.setAttribute("audioCaptcha", ac);
//IO流
Sample sample = ac.getChallenge();
response.setHeader("Cache-Control", "private,no-cache,no-store");
response.setContentType("audio/wave");
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
AudioSystem.write(sample.getAudioInputStream(), AudioFileFormat.Type.WAVE, baos);
response.setContentLength(baos.size());
OutputStream os = response.getOutputStream();
os.write(baos.toByteArray());
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
这里已经实现自定义字符传入读出音频
哎呦有坑 answer 传入的abcde字符报错啦
期望是一个数字,得到的是“a”。
其实这个是有原因的
AudioCaptcha addVoice() 音频
我们接着看源码
如果不传参数 new RandomNumberVoiceProducer() 实例
再看RandomNumberVoiceProducer
这里把char 转成 Integer 哎呦 emmmmm
原来是
simpleCaptcha 在提供音频的是配置默认路径 我找到路径下的音频,发现simpleCaptcha 只有提供啦0-9的音频
所以想要支持26个字母需要提供相应的音频,最后扩展VoiceProducer 的默认实现
谢谢观看!!