simpleCaptcha语音验证码实现及其扩展

simpleCaptcha 语音实现及其扩展

在我了解的的Captcha中 有两个框架一个JCaptcha和simpleCaptcha都可以去实现语音验证码,JCaptcha比较的麻烦,所以我对语音验证码实现用比较简单的simpleCaptcha
多的不说了直接来

准备工作

  1. 首先下载架包,这个架包在maven仓库是找不到的,只能从官网下载,官网地址链接: http://simplecaptcha.sourceforge.net .
  2. 然后将复制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 的默认实现

谢谢观看!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值