美文网首页我爱编程
Java实现验证码思路

Java实现验证码思路

作者: 杨凯飞 | 来源:发表于2018-05-24 22:03 被阅读0次

    java验证码的主要思路

        1.生成一个固定尾数的随机字符串

        2.在内存中创建一个图片(固定高度和宽度的矩形)

        3.开始绘制验证码,设置文字的字体、颜色、大小、以及一些干扰线

        4.结束绘制

        5.重定向写入(图片格式)

        1、关于随机的字符串,我们可以预先定于一个字符串(26个英文字母加10个阿拉伯数字),然后随机生成一个[0,35]之间的数字,之后利用string.charAt()方法得到其中的一位字母,最后吧生成的字母添加到StringBuilder里。(根据情况利用for循环生成指定尾数的验证码,之后把验证码返回)

        2、首先指定图片的高度和宽度(为了后期的维护和封装),之后利用BufferedImage来在内存中创建一个图片。

        3、根据Graphics2D来绘制图像(矩形),设置字体、颜色、背景色及位置和大小,之后计算出文字的坐标及位置,最后将文字画入里面。

    下面是代码

    package cn.jiaoshou.code;

    import javax.imageio.ImageIO;

    import javax.servlet.http.HttpServletResponse;

    import java.awt.*;

    import java.awt.font.FontRenderContext;

    import java.awt.geom.Rectangle2D;

    import java.awt.image.BufferedImage;

    import java.util.Random;

    /** * 验证码工具类 */

    public class CaptcahCode {

        /** * 验证码生成的方法

        * @param response

        * @return

        */

        public static String drawImage(HttpServletResponse response) {

            //1.定义一个字符串的拼接的StringBuilder StringBuilder builder=new StringBuilder();

            //产生4个字符串的随机数

            for (int i = 0; i < 5; i++) {

            builder.append(randomChar());

            }

            String code=builder.toString();

            //2.定义图片的宽度和高度 int width=100;

            int height=25;

            //简历bufferedImage对象,指定图片的长度和宽度以及色彩

            BufferedImage bi =new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR); //绘制缓冲流,在内存中创建图片

            //3.获取到Graphics2D绘制对象,开始绘制验证码

            Graphics2D g=bi.createGraphics();

            //图片绘制对象

            //4.设置文字的字体、颜色、大小

            Font font=new Font("微软雅黑",Font.PLAIN,20);

            Color color=new Color(255,255,255);

            g.setFont(font);

            //设置字体

            g.setColor(color);

            //设置颜色

            g.setBackground(new Color(0,0,0));

            g.clearRect(0,0,width,height);

            //干扰线的绘制,绘制线条到图片中

            g.setColor(getRandomColor(180,230));

            Random random = new Random();

            for(int i=0;i<10;i++){

            int x = random.nextInt(width);

            int y = random.nextInt(height);

            int x1 = random.nextInt(60);

            int y1 = random.nextInt(60);

            g.drawLine(x,y,x1,y1);

            }

            //绘制形状,获取矩形对象

            FontRenderContext context=g.getFontRenderContext();//矩形

            Rectangle2D bounds=font.getStringBounds(code,context);

            //计算文字的坐标和间距

            double x=(width-bounds.getWidth())/2;

            double y=(height-bounds.getHeight())/2;

            double ascent=bounds.getY();

            double basey=y-ascent;

            g.drawString(code,(int)x,(int)basey);

            //结束绘制

            g.dispose();

            try {

                ImageIO.write(bi,"jpg",response.getOutputStream());

                //刷新响应流

                response.flushBuffer();

            }catch (Exception ex){

                ex.printStackTrace();

            }

            return code;

            }

            /**

            * 范围随机颜色

            * @param fc

            * @param bc

            * @return

            */

            public static Color getRandomColor(int fc,int bc){

                //利用随机数

                Random random = new Random();

                //随机颜色,了解颜色Color(red,green,blue).rgb三元色 0-255

                if(fc>255)fc = 255;

                if(bc>255)bc = 255;

                int r = fc+random.nextInt(bc-fc);

                int g = fc+random.nextInt(bc-fc);

                int b = fc+random.nextInt(bc-fc);

                return new Color(r,g,b);

            }

            /**

            * 产生随机数字和字母

            * @return

            */

            public static char randomChar() {

            //1.定义验证需要的字母和数字

            String string="qwertyuioplkjhgfdsazxcvbnm1234567890";

            //2.定义随机对象 Random random=new Random();

            return string.charAt(random.nextInt(string.length()));

            }

    }

    总结:在实战的过程中,运行的的时候图片一直出现错误,之后找了很多原因都没发现错误。知道半个小时候才发现,在写入的时候把图片格式写成了jsp而不是jpg。(一个大写的妈卖批)

    相关文章

      网友评论

        本文标题:Java实现验证码思路

        本文链接:https://www.haomeiwen.com/subject/cijejftx.html