之前做的一个点选验证码,把代码贴出来,如果有需要可以根据实际情况修改
普通验证码:https://blog.csdn.net/weisong530624687/article/details/78861721
JAVA Graphics实现变色、渐变、阴影、倾斜、立体:
https://blog.csdn.net/weisong530624687/article/details/80048478
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.Random;
public abstract class AbstractRandCode {
/**
* 验证码缓存
*/
public static final String LOGIN_CAPTCHA = "_LOGIN_CAPTCHA";
public static final String LOGIN_CAPTCHA_NAMESPACE = "RandCode";
/**
* 随机码Img
*/
private BufferedImage bufferedImage;
/**
* 国际化语言
*/
private String language;
public BufferedImage getBufferedImage() {
return bufferedImage;
}
public void setBufferedImage(BufferedImage bufferedImage) {
this.bufferedImage = bufferedImage;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
/**
* 获取给定范围随机色
* @param basicValue
* @param extentValue
* @return
*/
protected Color getRandColor(int basicValue, int extentValue) {
Random random = new Random();
int basic = basicValue > 255 ? 255 : basicValue;
int extent = extentValue > 255 ? 255 : extentValue;
int r = basic + random.nextInt(extent - basic);
int g = basic + random.nextInt(extent - basic);
int b = basic + random.nextInt(extent - basic);
return new Color(r, g, b);
}
}
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.imageio.ImageIO;
import com.alibaba.fastjson.JSONArray;
/**
* 点选验证码
*/
public class PointSelectRandCode extends AbstractRandCode implements RandCode {
Log log = LogFactory.getLog(PointSelectRandCode.class);
/**
* 生成验证码的宽度
*/
private static final int WIDTH = 230;
/**
* 生成验证码的高度
*/
private static final int HEIGHT = 100;
/**
* 底部trip信息高度
*/
private static final int BOTTOM_HEIGHT = 35;
/**
* 字符大小
*/
private static final int FONT_SIZE = 24;
/**
* 定义点选文字图片验证码允许的误差值,单位是px
*/
private static final double ERROR_AMOUNT = FONT_SIZE / 3 * 2.0;
/**
* 干扰线个数
*/
private static final int LINE_COUNT = 120;
/**
* 设置字符位置数
*/
private static final Integer[] PLACE_ARRAY = new Integer[] {1, 2, 3, 4, 5};
/**
* 需要校验的字符个数
*/
private static final int VALIDATE_CHAR_NUM = 3;
/**
* 字符的颜色随机范围
*/
@SuppressWarnings("unused")
private static final Color[] CHAR_COLORS =
{Color.BLACK, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.PINK, Color.ORANGE};
/**
* 字符的颜色随机范围
*/
//private static final Color[] LIGHT_CHAR_COLORS = {Color.CYAN, Color.GREEN, Color.MAGENTA, Color.ORANGE, Color.WHITE, Color.YELLOW};
private static final Color[] LIGHT_CHAR_COLORS = {new Color(72, 76, 119)};
private static String separator = File.separator;
/**
* 图片资源路径
*/
private static final String IMG_PATH = separator + "static-res" + separator + "img" + separator + "login" + separator;
/**
* 背景图片资源路径
*/
private static final String BACK_