Java验证码

Java验证码的开发过程:

1:定义一个生成验证码的工具类。CaptcahCode.java.详细如下:

package com.imooc.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();
        //2.生成包含4个随机字符的字符串
        for(int i=0;i<4;i++){
            builder.append(randomChar());
        }
        String code = builder.toString();
        //3.定义图片的宽度和高度
        int width = 120;
        int height = 25;
        //4.建立bufferedImage对象,制定图片的宽度和高度以及色彩.
        //bufferedImage是一个图片的缓冲流,G2D会把绘制图片的每一个操作步骤写入缓冲流中,通过此缓冲流输出图片。
        BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
        //5.获取绘制对象:Graphics2D,也称它为画笔,用于绘制验证码
        Graphics2D g = bi.createGraphics();
        //6.设置文字的字体和大小
        Font font = new Font("微软雅黑",Font.PLAIN,20);
        g.setFont(font);
        //7.设置字体的颜色
        Color color = new Color(0,0,0);
        g.setColor(color);
        //8.背景图处理
        //设置背景色,此背景色用来覆盖(清除相关区域).
        g.setBackground(new Color(226,226,226));
        //清除的矩形区域。开始坐标:x,y,清除的宽和高
        g.clearRect(0,0,width,height);
        //9.绘制形状
        //获取读取文字的上下文
        FontRenderContext context = g.getFontRenderContext();
        //获取矩形对象:Rectangle2D,通过它进行文字位置的计算
        Rectangle2D bounds =font.getStringBounds(code,context);
        //10.计算文件的坐标和间距,bounds.getWidth()和getHeight()用来获取字符串的宽和高,
        // x为左侧空白的宽度,y为上侧空白的宽度
        double x =(width - bounds.getWidth())/2;
        double y =(height - bounds.getHeight())/2;
        //getY具体是什么意思,不得而知。
        double ascent = bounds.getY();
//        System.out.println("width:"+width+" height:"+height);
//        System.out.println("bounds.getWidth():"+bounds.getWidth());
//        System.out.println("bounds.getHeight():"+bounds.getHeight());
//        System.out.println("x:"+x+" y:"+y+"ascent:"+ascent);
        double baseY = y - ascent;
        //drawString(Stirng code,int x, int y),其中x,y指图片的坐标点,也即是从此处开始绘制字符串
        //这里需要指出的是:坐标的计算原点为矩形左下角,右侧为x+,上侧为y+;baseY就是字符串顶部的y坐标。
        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;
    }

    /**
     * 算数表达式验证码
     * 1.产生干扰线
     * 2.范围随机颜色
     * @param response
     * @return
     */
    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<100;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 result = 0;
        //产生一个0-2之间的随机整数,用来随机计算符号
        int fuhao =random.nextInt(3);
        String fuhaostr = "";
        switch(fuhao){
            case 0: fuhaostr ="+";result = num1 + num2;break;
            case 1: fuhaostr ="-";result = num1 - num2;break;
            case 2: 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();
        //随机颜色
        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);
    }

    /**
     * 此方法用于产生数字字母随机数
     * @return
     */
    private static char randomChar(){
        //1.定义验证码需要的字母和数字
        String string = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890";
        //2.定义随机对象
        Random random = new Random();
        //3.产生随机字母或数字。其中,nextInt(int n)用于产生0-n之间的随机整数
        return string.charAt(random.nextInt(string.length()));
    }

    public static void main(String[] args) {

    }

}

之后,定义一个jsp,用来进行一些处理。code.jsp

<%@ page import="com.imooc.code.CaptcahCode" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/7/7 0007
  Time: 上午 9:17
  To change this template use File | Settings | File Templates.
--%>
<%@ 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 contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Java验证码</title>
  </head>
  <body>
  <image src="code.jsp" alt="" id="code"></image>
  <a href="javascript:void(0);"οnclick="changeCode()">看不清?点我</a>
  <script>
    function changeCode(){
      document.getElementById("code").src="code.jsp?d="+new Date().getTime();    //此处加入时间戳,用来防止得到缓存结果,验证码重复
    }
  </script>
  </body>
</html>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值