Java实现验证码教程(一)字母数组混合验证码

随机获取字母数字组合

功能很简单,就是使用Java生成字母数字混合的验证码并输出到网页中,代码中的注释都很详细了,就不多废话了,如果自己能看懂代码那就真的学会了,如果有疑问可以在下面留言。

package com.jikewenku.code;

import javax.servlet.http.HttpServletResponse;
import java.util.Random;

/**
 * 验证码工具类
 */
public class CaptcahCode {
    /**
     * 验证码的生成方法
     *
     * @param response
     * @return
     */
    public static String drawImage(HttpServletResponse response) {
        //1:定义字符串拼接的StringBuilder
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            builder.append(randomChar());
        }
        String code = builder.toString();
        System.out.println(code);
        return null;
    }

    /**
     * 此方法用于产生随机数字母和数字
     *
     * @return
     */
    private static char randomChar() {
        //1:定义验证码需要的字母和数字
        String string = "QWERTYUIOPASDFGHJKLZXCVBNM0123456789";
        //2:定义随机对象
        Random random = new Random();
        return string.charAt(random.nextInt(string.length()));
    }

    public static void main(String[] args) {
        CaptcahCode.drawImage(null);
    }
}

运行程序,每次运行都会在控制台打印输出四位不同的字母数字的组合作为我们的验证码,至此我们完成了第一步,获取到了字母数字的随机组合。

验证码绘制

继续完成上面的代码,进行验证码绘制工作。

package com.jikewenku.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 < 4; i++) {
            builder.append(randomChar());
        }
        String code = builder.toString();
        //2:定义图片的宽度和高度
        int width = 120;
        int height = 25;
        //建立bufferdImage对象,制定图片的长度和宽度以及颜色
        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(0, 0, 0);
        //设置字体
        g.setFont(font);
        //设置颜色
        g.setColor(color);
        //设置背景
        g.setBackground(new Color(226, 226, 240));
        //开始绘制对象
        g.clearRect(0, 0, width, height);
        //绘制形状,获取矩形对象
        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;
    }

    /**
     * 此方法用于产生随机数字母和数字
     *
     * @return
     */
    private static char randomChar() {
        //1:定义验证码需要的字母和数字
        String string = "QWERTYUIOPASDFGHJKLZXCVBNM0123456789";
        //2:定义随机对象
        Random random = new Random();
        return string.charAt(random.nextInt(string.length()));
    }

    public static void main(String[] args) {
        CaptcahCode.drawImage(null);
    }
}

生成验证码页面

新建一个code.jsp

<%@ page import="com.jikewenku.code.CaptcahCode" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%

    //1:清空浏览器缓存,目的是为了清空浏览器的缓存,因为浏览器
    //会对网站的资源文件和图像进行记忆存储,如果被浏览器加载过的图片就记忆起来,记忆以后
    //文件就不会和服务器在交互,如果我们验证不清空的话可能会造成一个问题就是:验证刷新以后没有效果。
    response.setHeader("pragma","no-cache");
    response.setHeader("cache-control","no-cache");
    response.setHeader("expires","0");

    //2:调用编写的生成验证码的工具
    String code = CaptcahCode.drawImage(response);
    session.setAttribute("code",code);

    //3:如何解决getOutputStream异常问题
    out.clear();
    out = pageContext.pushBody();
%>

效果展示页面index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


  
    java验证码
	
	
	    
  
  

     
     看不清?点我%MINIFYHTML92381acaee5641348b3529b05a663d232%%MINIFYHTML92381acaee5641348b3529b05a663d233%

运行index.jsp,打开浏览器访问http://localhost:8080/index.jsp

如图所示,成功在网页上输出了验证码图片,并且点击“看不清?点我”就会重新刷新一次验证码。

源码下载

[fanctdl filename='JavaCode1.zip' filesize='19KB' href='https://pan.baidu.com/s/1-eh6UETfOMzo3Ob0HqB34A' filedown='百度网盘']回复可见密码[/fanctdl]

密码:

[reply]smp9[/reply]

本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
极客文库 » Java实现验证码教程(一)字母数组混合验证码

1 评论

  1. 毕设要求加个验证码 那我寻思就用个优秀一点的吧

Leave a Reply

欢迎加入「极客文库」,成为原创作者从这里开始!

立即加入 了解更多