手撸简单验证码

简介: 手撸简单验证码

      验证机制是所有登录或关键业务都会用到的功能,验证机制也是多种多样,比如简单的验证码,语言验证码,短信验证码,还有一些根据行为进行验证的验证机制。这次我们来实现一个简单的验证码。


输出验证码的类

      输出验证码是一个绘图的过程,绘图的过程大部分语言都是类似的,比如准备一个画布、准备一个画笔、然后在画布上绘制图形、输出内容等步骤。只是不同的语言具体调用的 API 不同而已。


       直接上代码,代码如下:

publicclassImageCode{
// 图形中的内容privateStringcode;
// 图片privateByteArrayInputStreamimage;
privateintwidth=400;
privateintheight=100;
publicstaticImageCodegetInstance() throwsIOException {
returnnewImageCode();
    }
privateImageCode() throwsIOException    {
// 图形缓冲区 画布BufferedImageimage=newBufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 画笔Graphicsgraphics=image.getGraphics();
// 涂色graphics.setColor(newColor(255, 255, 255));
// 画矩形graphics.fillRect(0, 0, width, height);
// 字体graphics.setFont(newFont("宋体", Font.PLAIN, 30));
Randomrandom=newRandom();
this.code="";
StringBuildersb=newStringBuilder(6);
for (inti=0; i<6; i++) {
Strings=String.valueOf(random.nextInt(10));
sb.append(s);
graphics.setColor(newColor(0, 0, 0));
graphics.drawString(s, (width/6) *i, 40);
        }
this.code=sb.toString();
// 收笔graphics.dispose();
ByteArrayInputStreaminputStream=null;
ByteOutputStreamoutputStream=newByteOutputStream();
try {
// 赋值给byteArrayInputStreamImageOutputStreamimageOutputStream=ImageIO.createImageOutputStream(outputStream);
ImageIO.write(image,"jpeg",imageOutputStream);
inputStream=newByteArrayInputStream(outputStream.toByteArray());
imageOutputStream.close();
        }catch (Exceptione){
System.out.println("生成验证码失败");
        } finally {
System.out.println("关闭资源");
outputStream.close();
        }
this.image=inputStream;
    }
}


输出验证码

       上面的类就是一个用于输出验证码的类,我们要测试该类,需要创建一个 SpringMVC 的项目来进行测试,测试也比较简单,直接上代码,代码如下。

@GetMapping("/verifyCode")
publicvoidgeneratorCode(HttpServletResponseresponse){
try {
ImageCodeimageCode=ImageCode.getInstance();
// 验证码的值Stringcode=imageCode.getCode();
// 验证码图片ByteArrayInputStreamimage=imageCode.getImage();
response.setContentType("image/jpeg");
byte[] bytes=newbyte[1024];
try(ServletOutputStreamout=response.getOutputStream()) {
while (image.read(bytes) !=-1 ){
out.write(bytes);
            }
        }
    }catch (Exceptione){
System.out.println("异常");
    }
}

      上面的代码也是非常简单的,直接看效果吧。

11111.png

       上面就是验证码的输出,刷新一下可以看到数字又进行了变化。


总结

       上面是一个简单的验证码,该验证码只是完成了简单的功能,在实际的场景中很容易被识别从而失去保护的作用。所以可以增加一些干扰线,或者对数字进行扭曲等变换。

相关文章
|
5天前
|
JavaScript 中间件 前端开发
[评论送书 ]手撕源码,实现一个Koa。,2024年最新学生会面试答题技巧
[评论送书 ]手撕源码,实现一个Koa。,2024年最新学生会面试答题技巧
|
10月前
|
存储 算法 数据处理
手撕学生管理系统超详解——【c++】
该程序的目标是提供一个简单且易于使用的学生成绩管理工具,以便教育机构能够有效地录入、修改、查询和排序学生的成绩信息。通过将学生信息保存到文件中,确保数据的持久性,即使在程序关闭后,学生成绩数据也能够被保留和恢复。
79 0
|
8月前
|
前端开发
前端表白源码
前端表白源码
|
8月前
|
算法 程序员
手撕代码
手撕代码是什么
|
9月前
|
缓存 调度
手撕代码系列(四)
手撕代码系列(四)
|
数据采集 JavaScript Java
手撸了一个java爬虫,发现了c站这么多大佬
手撸了一个java爬虫,发现了c站这么多大佬
201 0
手撸了一个java爬虫,发现了c站这么多大佬
|
存储 小程序 数据库
手把手教你撸一个小程序带太阳码的海报分享
我们都知道,微信小程序目前还不支持转发朋友圈,可能现在Android是支持了,iOS还不支持,但总的来说还不能支持普遍机型。这样假如我们需要推荐某个心仪的商品到朋友圈就没法分享出去,于是就可以使用生成海报的形式,让商品详情页的信息显示在一张图片上,保存到手机相册,然后发朋友圈,朋友可以长按识别海报上的小程序码直达该商品详情页面,从而达到如同直接分享商品详情页的效果。
666 0
手把手教你撸一个小程序带太阳码的海报分享
|
移动开发 小程序 前端开发
【视频刷刷刷】五分钟带你用uniapp做一个刷抖音的小程序
【视频刷刷刷】五分钟带你用uniapp做一个刷抖音的小程序
1391 0
【视频刷刷刷】五分钟带你用uniapp做一个刷抖音的小程序
|
JavaScript 前端开发
2022年了,你还不会手撕轮播图?
2022年了,你还不会手撕轮播图?纯手写轮播图对于初学者可能很难,也会有公司面试出轮播图来考察面试者的基础能力了。其实轮播图只要细分成几个小的模块,逐步实现起来还是比较简单的。
833 6

热门文章

最新文章

相关实验场景

更多