javaweb图形验证码示例

ImageServlet:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ImageServlet extends HttpServlet {
    private static final long serialVersionUID = -7529055574654373774L;

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        BufferedImage img = new BufferedImage(68, 30, 1);

        Graphics g = img.getGraphics();

        Random r = new Random();

        Color c = new Color(203, 226, 248);

        g.setColor(c);

        g.fillRect(0, 0, 68, 30);

        StringBuilder sb = new StringBuilder();

        char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();

        int len = ch.length;

        for (int i = 0; i < 50; i++) {
            int xs = r.nextInt(68);
            int ys = r.nextInt(30);
            int xe = xs + r.nextInt(8);
            int ye = ys + r.nextInt(3);
            int red = r.nextInt(255);
            int green = r.nextInt(255);
            int blue = r.nextInt(255);
            g.setColor(new Color(red, green, blue));
            g.drawLine(xs, ys, xe, ye);
        }

        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(len);

            g.setColor(new Color(r.nextInt(88), r.nextInt(188), r.nextInt(255)));
            if (i % 2 == 0) {
                g.setFont(new Font("Times New Roman", Font.BOLD | Font.ITALIC, 18 + r.nextInt(6)));
                g.drawString(String.valueOf(ch[index]), i * 15 + 3, 18);
            } else {
                g.setFont(new Font("Arial", Font.PLAIN, 18 + r.nextInt(6)));
                g.drawString(String.valueOf(ch[index]), i * 15 + 3, 28);
            }
            sb.append(ch[index]);
        }
        request.getSession().setAttribute("imageCode", sb.toString());

        ImageIO.write(img, "JPG", response.getOutputStream());
    }
}

第一个for循环绘制50条干扰线

第二个for循环绘制4位验证码

Linux + OpenJDK 下 g.drawString 会报 Could not initialize class sun.awt.X11FontManager 异常,执行 yum install -y fontconfig 重启应用解决问题

posted @ 2021-10-11 11:56  Nihaorz  阅读(112)  评论(0编辑  收藏  举报