• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

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

项目实战 Geekerstar 11个月前 (05-24) 578次浏览 已收录 1个评论 扫描二维码
文章目录[隐藏]

随机获取字母数字组合

功能很简单,就是使用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"%>
<!DOCTYPE HTML>
<html>
  <head>
    <title>java验证码</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
  </head>
  <body>

     <img src="https://cdn.jikewenku.com/qiniu/2629/image/788b19f7dceee92801cfbe3054ecf3d4.jpg?watermark/1/image/aHR0cHM6Ly93d3cuamlrZXdlbmt1LmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxOC8wNC8yMDE4MDQxODA4MTI0OTkzLnBuZw==/dissolve/100/gravity/SouthEast/dx/10/dy/10" alt="" id="code">
     <a href="javascript:void(0);" onclick="changeCode()">看不清?点我</a>
     <script>
         
         function changeCode() {
             document.getElementById("code").src = "code.jsp?d="+new Date().getTime();
         }

     </script>
  </body>
</html>

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

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

源码下载

文件下载

密码:

注意:本段内容须成功“回复本文”后“刷新本页”方可查看!


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Java实现验证码教程(一)字母数组混合验证码
喜欢 (0)
[247507792@qq.com]
分享 (0)
Geekerstar
关于作者:
本站技术支持

您必须 登录 才能发表评论!

(1)个小伙伴在吐槽
  1. 毕设要求加个验证码 那我寻思就用个优秀一点的吧
    1548123577@qq.com2019-04-14 20:50 Windows 10 | Chrome 69.0.3497.100
  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00