前台验证码简单生成

网站上的验证码的作用是保护网站安全,一般网站都要通过验证码来防止机器大规模注册,机器暴力破解数据密码等危害。java如何实现呢?废话不多说,以下是个简单的例子。

1.主要生成方法(包含main方法,直接运行即可)

package com.hcycom.vipmsrest.util;

import org.apache.commons.lang.RandomStringUtils;

import com.itextpdf.text.log.SysoCounter;

import javax.imageio.stream.FileImageOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Arrays;
import java.util.Base64;

public class GenerateCodeUtil {

	/**
	 * 去除 l、o、I、O、0、1、z、2 目的避免混淆
	 */
	private static final char[] CHAR_ARRAY = "abcdefghijkmnpqrstuvwxyABCDEFGHJKLMNPQRSTUVWXY3456789".toCharArray();
	public static int count = 0;
	public static int index = 1000;
	public static String[] CodeStr = new String[index];

	/**
	 * 将图片转换为base64字符串
	 * 
	 * @param timeStr
	 * @return
	 */
	public static String Base64Str(String timeStr) {
		String checkCode = RandomStringUtils.random(4, CHAR_ARRAY);
		System.out.println(checkCode);
		ByteArrayOutputStream os = (ByteArrayOutputStream) ImageUtil.generator(102, 25, checkCode);
		byte[] bytes = os.toByteArray();
		String encoded = Base64.getEncoder().encodeToString(bytes);
		code(timeStr, checkCode);
		return encoded;
	}

	/**
	 * 将登陆传进来的id(timeStr)和验证码存入数组
	 * 
	 * @param timeStr
	 * @param code
	 * @return
	 */
	public static String[] code(String timeStr, String code) {
		if ((!timeStr.trim().equals("")) && (!code.trim().equals(""))) {
			if (count < index) {
				String tempCode = timeStr + code;
				CodeStr[count] = tempCode;
				count++;
			} else {
				count = 0;
				String tempCode = timeStr + code;
				CodeStr[count] = tempCode;
			}
		}
		return CodeStr;
	}

	public static boolean codeCheck(String timeStr, String code) {
		boolean flag = false;
		String tempCode = timeStr + code;
		String[] CodeStr = code("", "");
		for (int i = 0; i < CodeStr.length; i++) {
			if (CodeStr[i] == "" || CodeStr[i] == null || CodeStr[i].length() == 0) {
				continue;
			}
			if (tempCode.toUpperCase().equals(CodeStr[i].toUpperCase())) {
				flag = true;
				return flag;
			}
		}
		return flag;
	}

	// 测试生成图片和base64
	public static void main(String[] args) {
		String checkCode = RandomStringUtils.random(4, CHAR_ARRAY);
		System.out.println(checkCode);
		ByteArrayOutputStream os = (ByteArrayOutputStream) ImageUtil.generator(102, 25, checkCode);
		byte[] bytes = os.toByteArray();
		String encoded = Base64.getEncoder().encodeToString(bytes);
		byte2image(bytes, "C:/Users/Desktop/911.jpg");
		System.out.println("编码:" + encoded);
		System.out.println("编码:" + ImageToBase64("C:/Users/Desktop/911.jpg"));
	}

	// 生成图片测试
	public static void byte2image(byte[] data, String path) {
		if (data.length < 3 || path.equals(""))
			return;
		try {
			FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
			imageOutput.write(data, 0, data.length);
			imageOutput.close();
			System.out.println("图片已生成,地址:" + path);
		} catch (Exception ex) {
			System.out.println("Exception: " + ex);
			ex.printStackTrace();
		}
	}

	 图片进行base64编码
	public static String ImageToBase64(String imgFile) {
		return Base64Utils.getImageStr(imgFile);

	}
}

2.用到的其他方法

package com.hcycom.vipmsrest.util;
 
 
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
 
public class ImageUtil {
    public ImageUtil() {
    }
 
    public static OutputStream generator(int width, int height, String checkCode) {
        BufferedImage image = new BufferedImage(width, height, 5);
        Graphics g = image.getGraphics();
        Random random = new Random();
        g.setColor(getRandColor(200, 250));
        g.fillRect(0, 0, width, height);
        g.setColor(getRandColor(0, 255));
        g.drawRect(0, 0, width - 1, height - 1);
        g.setColor(getRandColor(160, 200));
 
        int i;
        int y;
        for (i = 0; i < 8; ++i) {
            i = random.nextInt(width);
            y = random.nextInt(height);
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            g.drawLine(i, y, x1, y1);
        }
 
        g.setColor(getRandColor(160, 200));
 
        for (i = 0; i < 100; ++i) {
            i = random.nextInt(width);
            y = random.nextInt(height);
            g.drawLine(i, y, i, y);
        }
 
        Font font = new Font("Arial Black", 2, 25);
        g.setFont(font);
        g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
 
        for (i = 0; i < checkCode.length(); ++i) {
            g.drawString(String.valueOf(checkCode.charAt(i)), 22 * i + 2, 20);
        }
 
        g.dispose();
        ByteArrayOutputStream os = new ByteArrayOutputStream();
 
        try {
            ImageIO.write(image, "jpeg", os);
        } catch (IOException var11) {
            var11.printStackTrace();
        }
 
        return os;
    }
 
    private static Color getRandColor(int lower, int upper) {
        Random random = new Random();
        if (upper > 255) {
            upper = 255;
        }
 
        if (upper < 1) {
            upper = 1;
        }
 
        if (lower < 1) {
            lower = 1;
        }
 
        if (lower > 255) {
            lower = 255;
        }
 
        int r = lower + random.nextInt(upper - lower);
        int g = lower + random.nextInt(upper - lower);
        int b = lower + random.nextInt(upper - lower);
        return new Color(r, g, b);
    }
}

 

 

package com.hcycom.vipmsrest.util;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;

public class Base64Utils {
		
		//把base64编码的图片转成byte数组
		public static byte[] fromBase64ToBytes(String imgStr){
        if (imgStr == null)
                 return null;
             // 解密
             try {
               Decoder decoder = Base64.getDecoder();
                 byte[] b = decoder.decode(imgStr);
                 // 处理数据
                 for (int i = 0; i < b.length; ++i) {
                     if (b[i] < 0) {
                     b[i] += 256;
                     }
                 }
                 return b;
             } catch (Exception e) {
                 return null;
             }
		}
		
		//图片进行base64编码
	    public static String getImageStr(String imgFile) {
	        InputStream inputStream = null;
	        byte[] data = null;
	        try {
	            inputStream = new FileInputStream(imgFile);
	            data = new byte[inputStream.available()];
	            inputStream.read(data);
	            inputStream.close();
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	        // 加密
	        Encoder encoder = Base64.getEncoder();
	        return encoder.encodeToString(data);
	    }
	    
	    
	    public static boolean generateImage(String imgStr, String path) {
	    	if(imgStr == null){
	    		return false;
	    	}
	    	Decoder decoder = Base64.getDecoder();
	    	try {
				byte[] b = decoder.decode(imgStr);
				for (int i = 0; i < b.length; ++i) {
					if (b[i] < 0) {
						b[i] += 256;
					}
				}
				OutputStream out = new FileOutputStream(path);
				out.write(b);
				out.flush();
				out.close();
				return true;
			} catch (Exception e) {
				// TODO: handle exception
				return false;
			}
			
	    }
	    
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值