• 暂时停更一段时间!
  • 近期网站将陆续进行前端页面改造!
  • 招募网站编辑,联系站长!

Java实现验证码教程(二)算数验证码

文章目录[隐藏]

编写算数验证码绘制方法

这个方法比上一个高级一点,我们还用了干扰线。

public static  String drawImageVerificate(HttpServletResponse response){
    //定义验证码的宽度和高度
    int width = 100,height = 30;
    //在内存中创建图片
    BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
    //创建图片的上下文
    Graphics2D g = image.createGraphics();
    //产生随机对象,此随机对象主要用于算术表达式的数字
    Random random = new Random();
    //设置背景
    g.setColor(getRandomColor(240,250));
    //设置字体
    g.setFont(new Font("微软雅黑", Font.PLAIN,22));
    //开始绘制
    g.fillRect(0,0,width,height);

    //干扰线的绘制,绘制线条到图片中
    g.setColor(getRandomColor(180,230));
    for(int i=0;i<10;i++){
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        int x1 = random.nextInt(60);
        int y1 = random.nextInt(60);
        g.drawLine(x,y,x1,y1);
    }

    //开始进行对算术验证码表达式的拼接
    int num1 = (int)(Math.random()*10 + 1);
    int num2 = (int)(Math.random()*10 + 1);
    int fuhao = random.nextInt(3);//产生一个[0,2]之间的随机整数
    //记录符号
    String fuhaostr = null;
    int result = 0;
    switch (fuhao){
        case 0 : fuhaostr = "+";result = num1 + num2;break;
        case 1: fuhaostr = "-";result = num1 - num2;break;
        case 2 : fuhaostr = "*";result = num1 * num2;break;
        //case 3 : fuhaostr = "/";result = num1 / num2;break;  除法容易产生误解,所以不要
    }
    //拼接算术表达式,用户图片显示。
    String calc = num1 + " " + fuhaostr +" "+ num2 +" = ?";
    //设置随机颜色
    g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
    //绘制表达式
    g.drawString(calc,5,25);
    //结束绘制
    g.dispose();
    try {
        //输出图片到页面
        ImageIO.write(image,"JPEG",response.getOutputStream());
        return String.valueOf(result);
    }catch (Exception ex){
        ex.printStackTrace();
        return null;
    }
}

编写范围随机颜色方法

public static Color getRandomColor(int fc,int bc){
    //利用随机数
    Random random  = new Random();
    //随机颜色,了解颜色-Color(red,green,blue).rgb 三元色 0-255
    if(fc>255)fc = 255;
    if(bc>255)bc = 255;
    int r = fc+random.nextInt(bc-fc);
    int g = fc+random.nextInt(bc-fc);
    int b = fc+random.nextInt(bc-fc);
    return new Color(r,g,b);
}

修改 code.jsp 里的调用代码调用 drawImageVerificate 方法

<%@ 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.drawImageVerificate(response);
    session.setAttribute("code",code);

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

运行程序,输出如下结果

在这里我们就成功输出了带有干扰线的算术验证码,仔细研读代码体会整个绘制过程,相信会有很大收获。

源码下载

文件下载

密码:

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


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

邀请您免费 注册账号 登录 即可参与讨论!

(1)个小伙伴在吐槽
  1. 试试看
    9341140682018-11-05 15:15 Windows 10 | Chrome 70.0.3538.77