- 前言
这个主要是验证码功能, 防止客户端使用代码不断的进行发帖操作 [占用服务器资源, 发布无用的信息]
这个作品主要来自于这位网友, 我不过是将这位网友的代码进行’规范化’了一下, 提取了一个生成验证码的方法
。。后面的绘制到窗口的效果是我做的
方法声明
public static BufferedImage getCheckCode(int width, int height, Color bgColor, Font font, int validateCodeLength, List< Character> checkCodes, int minInterference, int interferenceOff)
其思路如下 : 创建一个宽高为width, height的BufferedImage, 然后配置其背景, 字体, 然后随机生成validateLength个checkCodes中的字符, 然后随机颜色的绘制到Image上面, 然后绘制n[至少minInterference, 偏移interferenceOff]条干扰线
**核心代码 **
/**
* file name : Test02GetCheckCode.java
* created at : 4:29:34 PM Nov 8, 2015
* created by
*/
package com.hx.test08;
public class Test02GetCheckCode {
/*
自我补充篇之java随机验证码的生成
Goal:利用java代码生成随机验证码的图片(今天终于想起写这个了)!
我的验证码的优势:每个字母的颜色不同~,大小写字母数字混合,干扰线无规律,颜色也不同!
缺点:有点传统
*/
/*
Author:Lovingshu's Forever
Date:2011-11-08 22:34
Remark:Suddenly,I think up that my hobby is programming~not gaming!
*/
// 来自 :
public static void main(String[] lovingshu){
//Create a image in RAM
//get the paint of the image in RAM
//seed of random
//fill the background
//the String of code
// 验证码的宽高, 验证码的长度
int width = 200;
int height = 100;
int validateCodeLength = 4;
// 最小的干扰线个数, 干扰线的个数的偏差, 背景颜色, 字体, 备选的验证码数据, 验证码可取的数据的长度
int minInterference = 5;
int interferenceOff = 5;
Color bgColor = Color.WHITE;
Font font = new Font("微软雅黑", Font.ITALIC, 40);
List<Character> checkCodes = new ArrayList<>(48);
initCheckCodes(checkCodes);
int checkCodeBackUpSize = checkCodes.size();
BufferedImage bufImage = getCheckCode(width, height, bgColor, font, validateCodeLength, checkCodes, minInterference, interferenceOff);
// out put the image [save to the file !]
// try {
// /*
// *if you want it be output at the Client,do as follows:
// *ImageIO.write(bufImage,"JPEG",response.getOutputStream());
// */
// File dstFile = new File(Tools.getTmpPath(30, Tools.PNG) );//this is the path
// ImageIO.write(bufImage,"jpeg",dstFile);
// if(dstFile.exists()){
// System.out.println("Success!");
// }else{
// System.out.println("Failed!");
// }
// } catch (IOException e) {
// e.printStackTrace();
// }finally{
// System.out.println("Lovingshu's Forever");
// }
// paint it !
new MyFrame(bufImage);
}
// 生成验证码图片
// checkCodeY 为验证码距离顶上的偏移, checkCodeXOff 表示每两个验证数据之间的x方向上的偏移
// 新建Image, 配置graphics
// 获取随机的validateLength个字符[颜色随机], 绘制到Image上
// 随机绘制干扰线 [至少minInterference, 个数偏差在[0, interferenceOff) ] [颜色随机]
public static BufferedImage getCheckCode(int width, int height, Color bgColor, Font font, int validateCodeLength, List<Character> checkCodes, int minInterference, int interferenceOff) {
int checkCodeY = height - (height >> 2);
int checkCodeXOff = width / (validateCodeLength+2);
BufferedImage bufImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
Graphics g = bufImage.getGraphics();
g.setColor(bgColor);
g.fillRect(0, 0, width, height);
g.setFont(font);
StringBuilder validateCode = new StringBuilder();
while(validateCode.length() < validateCodeLength){
g.setColor(randomColor() );
Character curChar = checkCodes.get(random(checkCodes.size()) );
g.drawString(curChar.toString(), (validateCode.length() + 1) * checkCodeXOff, checkCodeY);
validateCode.append(curChar );
}
//draw the interference line
int interferenceSize = (ran.nextInt(interferenceOff) + minInterference);
for(int i = 0; i < interferenceSize; i++){
g.setColor(randomColor() );
g.drawLine(random(width), random(height), random(width), random(height));
}
return bufImage;
}
// 初始化checkCodes [0-9 & a-z & A-Z]
private static void initCheckCodes(List<Character> checkCodes) {
for(char i='0'; i<'9'; i++) {
checkCodes.add(i);
}
for(char i='a'; i<'z'; i++) {
checkCodes.add(i);
}
for(char i='A'; i<'Z'; i++) {
checkCodes.add(i);
}
}
// random 对象
static Random ran = new Random();
// 获取给定范围内的随机数
public static int random(int range) {
return ran.nextInt(range);
}
// 获取一个随机的颜色
public static Color randomColor() {
return new Color(random(255)+1, random(255)+1, random(255)+1);
}
// 绘制窗口
static class MyFrame extends JFrame {
// 窗口的宽高
static int FRAMEWIDTH = 300;
static int FRAMEHEIGHT = 200;
// 初始化
public MyFrame(BufferedImage bufImage) {
add(new MyPanel(bufImage));
this.setVisible(true);
this.setBounds(100, 100, FRAMEWIDTH, FRAMEHEIGHT);
this.setTitle("CheckCode");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setResizable(false);
}
}
// 绘制面板
static class MyPanel extends JPanel {
// 需要绘制的图片
private BufferedImage bufImage;
// 初始化
public MyPanel(BufferedImage bufImage) {
this.bufImage = bufImage;
}
@Override
public void paint(Graphics g) {
g.drawImage(bufImage, 0, 0, this);
}
}
}
效果