0601 生成验证码
来源:互联网 发布:mac自动刷新功能 编辑:程序博客网 时间:2024/06/06 09:09
1. 前言
这个主要是验证码功能, 防止客户端使用代码不断的进行发帖操作 [占用服务器资源, 发布无用的信息]
这个作品主要来自于这位网友, 我不过是将这位网友的代码进行’规范化’了一下, 提取了一个生成验证码的方法
。。后面的绘制到窗口的效果是我做的
原文 : http://blog.csdn.net/lovingshu/article/details/6945932
方法声明
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 970655147 */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! */ // 来自 : http://blog.csdn.net/lovingshu/article/details/6945932 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); } }}
效果
参考
http://blog.csdn.net/lovingshu/article/details/6945932
0 0
- 0601 生成验证码
- 验证码生成及验证
- 生成验证码并验证
- 验证码生成与验证
- C#生成验证码
- C#生成验证码
- 生成验证码
- 验证码生成
- 生成验证码
- JSP生成验证码
- 生成验证码
- 生成验证码
- 数字验证码生成
- 动态生成验证码
- 生成验证码(1)
- 生成验证码(2)
- c# 生成验证码
- 生成验证码图像
- oc消息转发机制
- 如何让TabHost选项卡显示图片
- Radial basis function(径向基函数->(高斯核函数))
- ibatis源码学习(一)整体设计和核心流程
- CodeTyphon32中自带例子源码:另一个画箭头、线及形状的例子
- 0601 生成验证码
- Android日志打印与处理 UncaughtExceptionHandler 提交服务器
- 使用 IntelliJ IDEA 搭建go语言开发环境,亲测可用
- CF--B. Wilbur and Array
- linux网络重启命令
- window.print 打印页面指定区域
- ScrollView嵌套ListView冲突问题的解决方案
- 2015-11-16 今日二十词
- CodeTyphon32中自带例子源码:所有1500个源码打包下载