package com.example.util;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;
/**
*@描述 验证码生成
*/
public class VerifyCodeUtils{
//使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符
public static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
private static Random random = new Random();
/**
* 使用系统默认字符源生成验证码
* @param verifySize 验证码长度
* @return
*/
public static String generateVerifyCode(int verifySize){
return generateVerifyCode(verifySize, VERIFY_CODES);
}
/**
* 使用指定源生成验证码
* @param verifySize 验证码长度
* @param sources 验证码字符源
* @return
*/
public static String generateVerifyCode(int verifySize, String sources){
if(sources == null || sources.length() == 0){
sources = VERIFY_CODES;
}
int codesLen = sources.length();
Random rand = new Random(System.currentTimeMillis());
StringBuilder verifyCode = new StringBuilder(verifySize);
for(int i = 0; i < verifySize; i++){
verifyCode.append(sources.charAt(rand.nextInt(codesLen-1)));
}
return verifyCode.toString();
}
/**
* 生成随机验证码文件,并返回验证码值
* @param w
* @param h
* @param outputFile
* @param verifySize
* @return
* @throws IOException
*/
public static String outputVerifyImage(int w, int h, File outputFile, int verifySize) throws IOException{
String verifyCode = generateVerifyCode(verifySize);
outputImage(w, h, outputFile, verifyCode);
return verifyCode;
}
/**
* 输出随机验证码图片流,并返回验证码值
* @param w
* @param h
* @param os
* @param verifySize
* @return
* @throws IOException
*/
public static String outputVerifyImage(int w, int h, OutputStream os, int verifySize) throws IOException{
String verifyCode = generateVerifyCode(verifySize);
outputImage(w, h, os, verifyCode);
return verifyCode;
}
/**
* 生成指定验证码图像文件
* @param w
* @param h
* @param outputFile
* @param code
* @throws IOException
*/
public static void outputImage(int w, int h, File outputFile, String code) throws IOException{
if(outputFile == null){
return;
}
File dir = outputFile.getParentFile();
if(!dir.exists()){
dir.mkdirs();
}
try{
outputFile.createNewFile();
FileOutputStream fos = new FileOutputStream(outputFile);
outputImage(w, h, fos, code);
fos.close();
} catch(IOException e){
throw e;
}
}
/**
* 输出指定验证码图片流
* @param w
* @param h
* @param os
* @param code
* @throws IOException
*/
public static void outputImage(int w, int h, OutputStream os, String code) throws IOException{
int verifySize = code.length();
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Random rand = new Random();
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Color[] colors = new Color[5];
Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN,
Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
Color.PINK, Color.YELLOW };
float[] fractions = new float[colors.length];
for(int i = 0; i < colors.length; i++){
colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
fractions[i] = rand.nextFloat();
}
Arrays.sort(fractions);
g2.setColor(Color.GRAY);// 设置边框色
g2.fillRect(0, 0, w, h);
Color c = getRandColor(200, 250);
g2.setColor(c);// 设置背景色
g2.fillRect(0, 2, w, h-4);
//绘制干扰线
Random random = new Random();
g2.setColor(getRandColor(160, 200));// 设置线条的颜色
for (int i = 0; i < 20; i++) {
int x = random.nextInt(w - 1);
int y = random.nextInt(h - 1);
int xl = random.nextInt(6) + 1;
int yl = random.nextInt(12) + 1;
g2.drawLine(x, y, x + xl + 40, y + yl + 20);
}
// 添加噪点
float yawpRate = 0.05f;// 噪声率
int area = (int) (yawpRate * w * h);
for (int i = 0; i < area; i++) {
int x = random.nextInt(w);
int y = random.nextInt(h);
int rgb = getRandomIntColor();
image.setRGB(x, y, rgb);
}
shear(g2, w, h, c);// 使图片扭曲
g2.setColor(getRandColor(100, 160));
int fontSize = h-4;
Font font = new Font("Algerian", Font.ITALIC, fontSize);
g2.setFont(font);
char[] chars = code.toCharArray();
for(int i = 0; i < verifySize; i++){
AffineTransform affine = new AffineTransform();
affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize/2, h/2);
g2.setTransform(affine);
g2.drawChars(chars, i, 1, ((w-10) / verifySize) * i + 5, h/2 + fontSize/2 - 10);
}
g2.dispose();
ImageIO.write(image, "jpg", os);
}
private static Color getRandColor(int fc, int bc) {
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);
}
private static int getRandomIntColor() {
int[] rgb = getRandomRgb();
int color = 0;
for (int c : rgb) {
color = color << 8;
color = color | c;
}
return color;
}
private static int[] getRandomRgb() {
int[] rgb = new int[3];
for (int i = 0; i < 3; i++) {
rgb[i] = random.nextInt(255);
}
return rgb;
}
private static void shear(Graphics g, int w1, int h1, Color color) {
shearX(g, w1, h1, color);
shearY(g, w1, h1, color);
}
private static void shearX(Graphics g, int w1, int h1, Color color) {
int period = random.nextInt(2);
boolean borderGap = true;
int frames = 1;
int phase = random.nextInt(2);
for (int i = 0; i < h1; i++) {
double d = (double) (period >> 1)
* Math.sin((double) i / (double) period
+ (6.2831853071795862D * (double) phase)
/ (double) frames);
g.copyArea(0, i, w1, 1, (int) d, 0);
if (borderGap) {
g.setColor(color);
g.drawLine((int) d, i, 0, i);
g.drawLine((int) d + w1, i, w1, i);
}
}
}
private static void shearY(Graphics g, int w1, int h1, Color color) {
int period = random.nextInt(40) + 10; // 50;
boolean borderGap = true;
int frames = 20;
int phase = 7;
for (int i = 0; i < w1; i++) {
double d = (double) (period >> 1)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
SpringBoot+Shiro的demo (178个子文件)
VerifyCodeUtils.class 8KB
CustomerRealm.class 4KB
User.class 4KB
UserController.class 4KB
RedisCache.class 4KB
ShiroConfig.class 3KB
Role.class 3KB
MyByteSource.class 3KB
Perms.class 2KB
UserServiceImpl.class 2KB
SaltUtil.class 1KB
ApplicationContextUtil.class 1KB
OrderController.class 962B
MyByteSource$BytesHelper.class 961B
RedisCacheManager.class 934B
SpringbootShiroJspApplication.class 765B
UserDao.class 721B
UserService.class 602B
SpringbootShiroJspApplicationTests.class 563B
MyByteSource$1.class 220B
.gitignore 395B
.gitignore 233B
springboot_shiro_jsp.iml 14KB
VerifyCodeUtils.java 9KB
CustomerRealm.java 4KB
ShiroConfig.java 3KB
UserController.java 3KB
MyByteSource.java 3KB
RedisCache.java 2KB
OrderController.java 2KB
UserServiceImpl.java 1KB
ApplicationContextUtil.java 703B
UserDao.java 651B
SaltUtil.java 625B
RedisCacheManager.java 588B
UserService.java 556B
User.java 507B
Role.java 504B
Perms.java 441B
SpringbootShiroJspApplication.java 340B
SpringbootShiroJspApplicationTests.java 224B
index.jsp 1KB
login.jsp 805B
register.jsp 685B
HELP.md 721B
application.properties 731B
application.properties 731B
workspace.xml 12KB
uiDesigner.xml 9KB
pom.xml 4KB
UserDao.xml 2KB
UserDao.xml 2KB
Project_Default.xml 1KB
compiler.xml 913B
jarRepositories.xml 879B
Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_3_0_RELEASE.xml 769B
Maven__org_springframework_boot_spring_boot_starter_data_redis_2_3_0_RELEASE.xml 769B
Maven__org_springframework_boot_spring_boot_starter_logging_2_3_0_RELEASE.xml 748B
Maven__org_springframework_boot_spring_boot_starter_tomcat_2_3_0_RELEASE.xml 741B
Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_0.xml 736B
Maven__org_springframework_boot_spring_boot_autoconfigure_2_3_0_RELEASE.xml 734B
Maven__org_springframework_boot_spring_boot_starter_json_2_3_0_RELEASE.xml 727B
Maven__org_springframework_boot_spring_boot_starter_test_2_3_0_RELEASE.xml 727B
Maven__org_springframework_boot_spring_boot_starter_jdbc_2_3_0_RELEASE.xml 727B
Maven__org_springframework_boot_spring_boot_starter_web_2_3_0_RELEASE.xml 720B
Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml 700B
Maven__org_springframework_boot_spring_boot_devtools_2_3_0_RELEASE.xml 699B
Maven__org_springframework_data_spring_data_keyvalue_2_3_0_RELEASE.xml 699B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_0.xml 695B
Maven__org_springframework_spring_context_support_5_2_6_RELEASE.xml 693B
Maven__org_springframework_boot_spring_boot_starter_2_3_0_RELEASE.xml 692B
Maven__org_springframework_data_spring_data_commons_2_3_0_RELEASE.xml 692B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_0.xml 681B
Maven__org_springframework_data_spring_data_redis_2_3_0_RELEASE.xml 678B
Maven__tk_mybatis_mapper_spring_boot_autoconfigure_2_1_5.xml 671B
Maven__org_springframework_boot_spring_boot_test_2_3_0_RELEASE.xml 671B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_35.xml 660B
Maven__org_springframework_spring_expression_5_2_6_RELEASE.xml 658B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_0.xml 651B
Maven__org_apache_shiro_shiro_spring_boot_starter_1_7_1.xml 646B
Maven__org_apache_tomcat_embed_tomcat_embed_jasper_9_0_35.xml 639B
Maven__org_springframework_spring_context_5_2_6_RELEASE.xml 637B
Maven__org_apache_tomcat_tomcat_annotations_api_9_0_35.xml 636B
Maven__org_springframework_boot_spring_boot_2_3_0_RELEASE.xml 636B
Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml 633B
Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml 633B
Maven__org_junit_platform_junit_platform_commons_1_6_2.xml 633B
Maven__org_springframework_spring_webmvc_5_2_6_RELEASE.xml 630B
Maven__com_fasterxml_jackson_core_jackson_databind_2_11_0.xml 630B
Maven__tk_mybatis_mapper_spring_boot_starter_2_1_5.xml 629B
Maven__org_junit_platform_junit_platform_engine_1_6_2.xml 626B
Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_35.xml 625B
Maven__org_springframework_spring_beans_5_2_6_RELEASE.xml 623B
Maven__commons_collections_commons_collections_3_2_2.xml 616B
Maven__org_springframework_spring_core_5_2_6_RELEASE.xml 616B
Maven__org_springframework_spring_test_5_2_6_RELEASE.xml 616B
Maven__org_springframework_spring_jdbc_5_2_6_RELEASE.xml 616B
Maven__org_junit_vintage_junit_vintage_engine_5_6_2.xml 615B
Maven__io_projectreactor_reactor_core_3_3_5_RELEASE.xml 615B
Maven__org_junit_jupiter_junit_jupiter_params_5_6_2.xml 615B
共 178 条
- 1
- 2
资源评论
zhanghe687
- 粉丝: 129
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功