验证机制是所有登录或关键业务都会用到的功能,验证机制也是多种多样,比如简单的验证码,语言验证码,短信验证码,还有一些根据行为进行验证的验证机制。这次我们来实现一个简单的验证码。
输出验证码的类
输出验证码是一个绘图的过程,绘图的过程大部分语言都是类似的,比如准备一个画布、准备一个画笔、然后在画布上绘制图形、输出内容等步骤。只是不同的语言具体调用的 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 的项目来进行测试,测试也比较简单,直接上代码,代码如下。
"/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("异常"); } }
上面的代码也是非常简单的,直接看效果吧。
上面就是验证码的输出,刷新一下可以看到数字又进行了变化。
总结
上面是一个简单的验证码,该验证码只是完成了简单的功能,在实际的场景中很容易被识别从而失去保护的作用。所以可以增加一些干扰线,或者对数字进行扭曲等变换。