Verification Code Picture Generation and Solution to the Problem of Unable to Display

Keywords: PHP Java Tomcat codec Session

IntelliJ IDEA implements verification code related module for web page generation:

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public final class ImageUtil {
    private static final char[] chars = { '0', '1', '2', '3', '4', '5', '6',
            '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I' };
    private static final int SIZE = 4;
    private static final int LINES = 5;
    private static final int WIDTH = 80;
    private static final int HEIGHT = 40;
    private static final int FONT_SIZE = 30;

    public static Map<String, BufferedImage> createImage() {
        StringBuffer sb = new StringBuffer();
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
        Graphics graphic = image.getGraphics();
        graphic.fillRect(0, 0, WIDTH, HEIGHT);
        Random ran = new Random();
        for (int i = 1; i <= SIZE; i++) {
            int r = ran.nextInt(chars.length);
            graphic.setFont(new Font(null, Font.BOLD + Font.ITALIC, FONT_SIZE));
            graphic.drawString(chars[r] + "", (i - 1) * WIDTH / SIZE,
                    HEIGHT / 2);
        for (int i = 1; i <= LINES; i++) {
            graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT),
                    ran.nextInt(WIDTH), ran.nextInt(HEIGHT));
        Map<String, BufferedImage> map = new HashMap<String, BufferedImage>();
        map.put(sb.toString(), image);
        return map;

    public static Color getRandomColor() {
        Random ran = new Random();
        Color color = new Color(ran.nextInt(256), ran.nextInt(256),
        return color;

    public static InputStream getInputStream(BufferedImage image)
            throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
        byte[] imageBts = bos.toByteArray();
        InputStream in = new ByteArrayInputStream(imageBts);
        return in;

Generate authentication code ImageUtill class


     * Generate login page authentication code
    public void createImage(
            HttpServletResponse response, HttpSession session)
            throws Exception {
        Map<String, BufferedImage> imageMap = ImageUtil.createImage();
        String code = imageMap.keySet().iterator().next();
        session.setAttribute("imageCode", code);
        BufferedImage image = imageMap.get(code);
        OutputStream ops = response.getOutputStream();
        ImageIO.write(image, "jpeg", ops);

JSP Web page call (fragment, put the above into src):

<td class="login_info">authentication code:</td>
<td class="width70"><input name="code" type="text" class="width70" id="code" onfocus="set_msg('code_msg','');"/></td>
<td> <img src="" alt="verification code" title="click to replace" id="code_image" onclick="change();"/></td>
<td><span class="required" id="code_msg"></span></td>

The procedure is correct!

Can be written as a Java program to verify the generation of pictures:

However, the validation code picture cannot be displayed on the web page. Error messages cannot be written to Tomcat's temp directory, but the temp directory must exist, because the temp directory must have administrator privileges.
Enter the tomcat installation directory: C: Program Files Apache Software Foundation tomcat 8.5
Right-click temp attribute:

Check all rights for all users, problem solving!!!

Posted by lanjoky on Tue, 08 Oct 2019 23:00:22 -0700