网站上的验证码的作用是保护网站安全,一般网站都要通过验证码来防止机器大规模注册,机器暴力破解数据密码等危害。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;
}
}
}