在服务端实现验证码代码

作者: GuaKin_Huang | 来源:发表于2016-11-13 15:35 被阅读69次

    package com.nlte;
    
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    /**
     * Created by hp on 2016/10/26.
     */
    public class IdentityServlet extends HttpServlet{
        //显示的字符
        public static final char[] CHARS = {'2', '3', '4', '5', '6', '7', '8',
                                            '9', 'A', 'B', 'C', 'D', 'E', 'F',
                                            'G', 'H', 'J', 'K', 'L', 'M', 'N',
                                            'P', 'Q', 'R', 'S', 'T', 'U', 'V',
                                            'W', 'X', 'Y', 'Z','@', '#', '%', '&'};
        public static Random random = new Random();//随机数
    
        /**
         * 获取随机字符串
         * @return
         */
        public static String getRandomString(){
            StringBuffer buffer = new StringBuffer();
    
            //显示6个字符
            for (int i = 0; i < 6; i++) {
                buffer.append(CHARS[random.nextInt(CHARS.length)]);
            }
            return buffer.toString();
        }
    
        /**
         * 获取随机颜色
         * @return
         */
        public static Color getRandomColor(){
            return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
        }
    
        /**
         * 随机颜色取反
         * @param c
         * @return
         */
        public static Color getReverseColor(Color c){
            return new Color(255-c.getRed(), 255-c.getGreen(), 255-c.getBlue());
        }
    
        @Override
        protected void doGet(HttpServletRequest req,
                             HttpServletResponse resp)
                throws ServletException, IOException {
    
            resp.setContentType("image/jpeg");//设置输出类型,必须的
    
            String randomString = getRandomString();
            req.getSession(true).setAttribute("randomString", randomString);//放到 session 中
    
            int width = 100;//图片宽度
            int height = 30;//图片高度
    
            Color color = getRandomColor();//随机颜色,用于背景颜色
            Color reverse = getReverseColor(color);//反色,用于前景色
    
            BufferedImage bi = new BufferedImage(
                    width,
                    height,
                    BufferedImage.TYPE_INT_RGB);//创建一个彩色图片
            Graphics2D g = bi.createGraphics();//获取绘图对象
            g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));//设置字体
            g.fillRect(0, 0, width, height);//绘制背景
            g.setColor(color);//设置颜色
            g.drawString(randomString, 18, 20);//绘制随机字符串
            for (int i = 0, n= random.nextInt(100); i<n; i++) {
                g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);//绘制随即噪音点
            }
    
            ServletOutputStream out = resp.getOutputStream();//转换成JPEG格式
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);//编码器
            encoder.encode(bi);//对图片进行编码
            out.flush();//输出到客户端
        }
    
        @Override
        protected void doPost(HttpServletRequest req,
                              HttpServletResponse resp)
                throws ServletException, IOException {
        }
    }
    
    
    

    结果

    效果图.png

    相关文章

      网友评论

        本文标题:在服务端实现验证码代码

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