• Java WebServlet生成图片验证码


    一,验证码生成属性,方法配置类

    //图片类
    public class VerifyCode {
        private int w = 70;
        private int h = 35;
        private Random r = new Random();
        // {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}
        private String[] fontNames =
                { "宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312" };
        // 可选字符
        private String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
        // 背景色
        private Color bgColor = new Color(255, 255, 255);
        // 验证码上的文本
        private String text;
    
        // 生成随机的颜色
        private Color randomColor() {
            int red = r.nextInt(150);
            int green = r.nextInt(150);
            int blue = r.nextInt(150);
            return new Color(red, green, blue);
        }
    
        // 生成随机的字体
        private Font randomFont() {
            int index = r.nextInt(fontNames.length);
            String fontName = fontNames[index];// 生成随机的字体名称
            int style = r.nextInt(4);// 生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体)
            int size = r.nextInt(5) + 24; // 生成随机字号, 24 ~ 28
            return new Font(fontName, style, size);
        }
    
        // 画干扰线
        private void drawLine(BufferedImage image) {
            int num = 3;// 一共画3条
            Graphics2D g2 = (Graphics2D) image.getGraphics();
            for (int i = 0; i < num; i++) {// 生成两个点的坐标,即4个值
                int x1 = r.nextInt(w);
                int y1 = r.nextInt(h);
                int x2 = r.nextInt(w);
                int y2 = r.nextInt(h);
                g2.setStroke(new BasicStroke(1.5F));
                g2.setColor(Color.BLUE); // 干扰线是蓝色
                g2.drawLine(x1, y1, x2, y2);// 画线
            }
        }
    
        // 随机生成一个字符
        private char randomChar() {
            int index = r.nextInt(codes.length());
            return codes.charAt(index);
        }
    
        // 创建BufferedImage
        private BufferedImage createImage() {
            BufferedImage image = new BufferedImage(w, h,
                    BufferedImage.TYPE_INT_RGB);
            Graphics2D g2 = (Graphics2D) image.getGraphics();
            g2.setColor(this.bgColor);
            g2.fillRect(0, 0, w, h);
            return image;
        }
    
        // !调用这个方法得到验证码
        public BufferedImage getImage() {
            BufferedImage image = createImage();// 创建图片缓冲区
            Graphics2D g2 = (Graphics2D) image.getGraphics();// 得到绘制环境
            StringBuilder sb = new StringBuilder();// 用来装载生成的验证码文本
            // 向图片中画4个字符
            for (int i = 0; i < 4; i++) {// 循环四次,每次生成一个字符
                String s = randomChar() + "";// 随机生成一个字母
                sb.append(s); // 把字母添加到sb中
                float x = i * 1.0F * w / 4; // 设置当前字符的x轴坐标
                g2.setFont(randomFont()); // 设置随机字体
                g2.setColor(randomColor()); // 设置随机颜色
                g2.drawString(s, x, h - 5); // 画图
            }
            this.text = sb.toString(); // 把生成的字符串赋给了this.text
            drawLine(image); // 添加干扰线
            return image;
        }
    
        // 返回验证码图片上的文本
        public String getText() {
            return text;
        }
    
        // 保存图片到指定的输出流
        public static void output(BufferedImage image, OutputStream out) throws IOException {
            ImageIO.write(image, "JPEG", out);
        }
    }

    二,调用方法生成验证码图片显示

    @WebServlet(urlPatterns = "/verifycode")
    public class VerifyCodeServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            VerifyCode verifyCode = new VerifyCode();
            verifyCode.output(verifyCode.getImage(), response.getOutputStream());
            String str = verifyCode.getText();
            System.out.println(str);
        }
    }

    界面代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>index</title>
        <script>
          /*
              分析:
                  点击超链接或者图片,需要换一张
                  1.给超链接和图片绑定单击事件
                  2.重新设置图片的src属性值
           */
          window.onload = function(){
            //1.获取图片对象
            var img = document.getElementById("Code");
            //2.绑定单击事件
            var btn = document.getElementById("btnCode");
            btn.onclick = function(){
              //加时间戳
              var date = new Date().getTime();
              /*时间永远不重复,则不会访问缓存*/
              img.src = "/web01/verifycode?"+date;
            }
    
          }
        </script>
      </head>
      <body>
     
      <br/>
      <img id="Code" src="/web01/verifycode" /> <!--自动生成图片的路径-->
    
      <a id="btnCode" href="javascript:void(0)">看不清换一张?</a>
      </body>
    </html>

    效果

  • 相关阅读:
    bzoj1005: [HNOI2008]明明的烦恼(prufer+高精度)
    bzoj1211: [HNOI2004]树的计数(prufer序列+组合数学)
    bzoj1430: 小猴打架(prufer序列)
    bzoj1029: [JSOI2007]建筑抢修(堆+贪心)
    bzoj1053: [HAOI2007]反素数ant
    [HNOI2012]双十字
    [HNOI2012]矿场搭建
    [HNOI2012]集合选数
    [HNOI2013]消毒
    POJ2449 Remmarguts' Date
  • 原文地址:https://www.cnblogs.com/qingjiawen/p/14047675.html
Copyright © 2020-2023  润新知