- 浏览: 425440 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
iwwenbo:
别逗好不好
Popup.js 弹出窗口 -
bugnuke:
尼玛 跑不了。。。
Popup.js 弹出窗口 -
tangzhifei:
创建Subversion授权文件放哪目录下?前面我的都对了,到 ...
Trac系列(8):windows下Apache+SVN+Trac安装及配置(一) -
zoutuo1986:
正在安装,确实很慢,一定要选择网速快的时候安装,
eclipse 插件springide安装 -
johnsonyang:
this.jmsTemplate.send(
...
spring,weblogic配置jms
Java代码
package com.toy;
import java.util.Random;
import java.io.UnsupportedEncodingException;
import java.io.OutputStream;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.*;
/**
* 一个能生成验证码的类
* 默认四个汉字
* 使用该类生成验证码时
* @author jiangjizhong
*/
public class VerifyCode {
private final Random random = new Random(System.nanoTime());
private int width;
private int height;
private int charNumber = 4;
private float yawpRate = 0.2f; //噪声率
private OutputStream outputStream;
private char[] code;
public VerifyCode() {
//empty
}
/**
* 返回生成的验证码字符串
* @return
*/
public String getVerifyCode(){
return new String(code);
}
public VerifyCode(int width, int height) {
this.width = width;
this.height = height;
}
private void drawPane(Graphics2D g2d){
g2d.setColor(Color.BLACK);
g2d.setStroke(new BasicStroke(2.0f));
g2d.drawRect(0, 0, width, height);
}
private void drawChars(Graphics2D g2d){
float scale = 1f;
int size = (int) (scale * height);
int offsetHeight = (height + size) / 2;
StringBuffer sb = new StringBuffer(1);
sb.setLength(1);
g2d.setColor(Color.BLACK);
code = new char[charNumber];
for (int i = 0; i < charNumber; i++) {
//计算第i个字的x偏移
int offsetWidth = i * size;
//随机大小
int charSize = this.getRandomIntBetween((int) (size * 0.5), size);
//随机样式
int fontStyle = this.getRandomBoolean() ? Font.ITALIC : Font.ITALIC;
g2d.setFont(new Font("隶书", fontStyle, charSize));
//随机颜色
//g2d.setColor(this.getRandomColor());
//随机上移一点
int moveUp = random.nextInt((int) (0.3 * height));
//随机字符
char c = this.getRandomChar();
code[i] = c;
sb.setCharAt(0, c);
g2d.drawString(sb.toString(), offsetWidth, offsetHeight - moveUp);
}
}
private void drawSmallChars(Graphics2D g2d){
final int lines = 5;
int fontSize = this.getHeight() / lines;
int number = this.getWidth() / fontSize;
g2d.setFont(new Font("隶书", Font.PLAIN, fontSize));
g2d.setColor(this.getRandomColor());
for(int i=0; i<10;i++){
StringBuffer sb = new StringBuffer(number);
for(int j=0; j<number; j++){
sb.append(this.getRandomChar());
}
g2d.drawString(sb.toString(), 0, (i + 1) * fontSize);
}
}
/**
* 主要方法,开始生成
*/
public void write() {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bi.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
//画方框9/10期望宽度
this.drawPane(g2d);
//设定字体,字体大小为4/5方框,居中
this.drawChars(g2d);
/*补充注释:有些人添加干扰时,喜欢使用随机线条。我认为这个方法一点都不好,不仅是图片极度丑陋,而且根本起不到干扰的作用。*/
//背景上随机10行小字
this.drawSmallChars(g2d);
//添加噪点
int area = (int) (this.getYawpRate() * height * width);
for (int i = 0; i < area; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int rgb = this.getRandomIntColor();
bi.setRGB(x, y, rgb);
}
try {
ImageIO.write(bi, "jpeg", outputStream);
} catch (Exception exc) {
exc.printStackTrace();
}
}
private boolean getRandomBoolean() {
int randInt = random.nextInt(10);
if (randInt > 4) {
return true;
} else {
return false;
}
}
private Color getRandomColor() {
int[] rgb = this.getRandomRgb();
return new Color(rgb[0], rgb[1], rgb[2]);
}
private int getRandomIntColor() {
int[] rgb = this.getRandomRgb();
int color = 0;
for (int c : rgb) {
color = color << 8;
color = color | c;
}
return color;
}
private int[] getRandomRgb() {
int[] rgb = new int[3];
for (int i = 0; i < 3; i++) {
rgb[i] = random.nextInt(255);
}
return rgb;
}
/**
* 返回一个随机汉字字符。
* 采用随机生成两个byte按gb2312编码构成一个String的算法。
* 两个字节在B0A1到D7F9之间,是常用简体字
* 所以,第一个字节在B0(十进制176)到D7(十进制215)之间,第二个字节在A1(十进制161)到F9(十进制249)之间
* @return
*/
protected char getRandomChar() {
final int minFirstByte = 176;
final int maxFirstByte = 215;
final int minSecondByte = 161;
final int maxSecondByte = 249;
byte[] b = new byte[2];
b[0] = (byte) (getRandomIntBetween(minFirstByte, maxFirstByte));
b[1] = (byte) (getRandomIntBetween(minSecondByte, maxSecondByte));
try {
String s = new String(b, "gb2312");
assert s.length() == 1;
return s.charAt(0);
} catch (UnsupportedEncodingException uee) {
//重试
return getRandomChar();
}
}
/**
* 获取两个整数之间的某个随机数,包含较小的整数,不包含较大的整数
* @param first
* @param second
* @return 随机数
*/
private int getRandomIntBetween(int first, int second) {
if (second < first) {
int tmp = first;
first = second;
second = tmp;
}
return random.nextInt(second - first) + first;
}
public int getWidth() {
return width;
}
/**
* 验证码图片的宽度,一般的,宽度应该是高度乘以字符数目
*/
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
/**
* 验证码图片的高度
*/
public void setHeight(int height) {
this.height = height;
}
public OutputStream getOutputStream() {
return outputStream;
}
/**
* 验证码输出地址,如果是在jsp或servlet里使用,这里的outputStream就是从Response对象里获取的outputStream
*/
public void setOutputStream(OutputStream outputStream) {
this.outputStream = outputStream;
}
public int getCharNumber() {
return charNumber;
}
/**
* 生成验证码的字符数量,默认四个
*/
public void setCharNumber(int charNumber) {
this.charNumber = charNumber;
}
public float getYawpRate() {
return yawpRate;
}
/**
* 设定噪声率,既图像上出现的噪声像素占全部像素的比例
* @param yawpRate
*/
public void setYawpRate(float yawpRate) {
this.yawpRate = yawpRate;
}
}
package com.toy;
import java.util.Random;
import java.io.UnsupportedEncodingException;
import java.io.OutputStream;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.*;
/**
* 一个能生成验证码的类
* 默认四个汉字
* 使用该类生成验证码时
* @author jiangjizhong
*/
public class VerifyCode {
private final Random random = new Random(System.nanoTime());
private int width;
private int height;
private int charNumber = 4;
private float yawpRate = 0.2f; //噪声率
private OutputStream outputStream;
private char[] code;
public VerifyCode() {
//empty
}
/**
* 返回生成的验证码字符串
* @return
*/
public String getVerifyCode(){
return new String(code);
}
public VerifyCode(int width, int height) {
this.width = width;
this.height = height;
}
private void drawPane(Graphics2D g2d){
g2d.setColor(Color.BLACK);
g2d.setStroke(new BasicStroke(2.0f));
g2d.drawRect(0, 0, width, height);
}
private void drawChars(Graphics2D g2d){
float scale = 1f;
int size = (int) (scale * height);
int offsetHeight = (height + size) / 2;
StringBuffer sb = new StringBuffer(1);
sb.setLength(1);
g2d.setColor(Color.BLACK);
code = new char[charNumber];
for (int i = 0; i < charNumber; i++) {
//计算第i个字的x偏移
int offsetWidth = i * size;
//随机大小
int charSize = this.getRandomIntBetween((int) (size * 0.5), size);
//随机样式
int fontStyle = this.getRandomBoolean() ? Font.ITALIC : Font.ITALIC;
g2d.setFont(new Font("隶书", fontStyle, charSize));
//随机颜色
//g2d.setColor(this.getRandomColor());
//随机上移一点
int moveUp = random.nextInt((int) (0.3 * height));
//随机字符
char c = this.getRandomChar();
code[i] = c;
sb.setCharAt(0, c);
g2d.drawString(sb.toString(), offsetWidth, offsetHeight - moveUp);
}
}
private void drawSmallChars(Graphics2D g2d){
final int lines = 5;
int fontSize = this.getHeight() / lines;
int number = this.getWidth() / fontSize;
g2d.setFont(new Font("隶书", Font.PLAIN, fontSize));
g2d.setColor(this.getRandomColor());
for(int i=0; i<10;i++){
StringBuffer sb = new StringBuffer(number);
for(int j=0; j<number; j++){
sb.append(this.getRandomChar());
}
g2d.drawString(sb.toString(), 0, (i + 1) * fontSize);
}
}
/**
* 主要方法,开始生成
*/
public void write() {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bi.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
//画方框9/10期望宽度
this.drawPane(g2d);
//设定字体,字体大小为4/5方框,居中
this.drawChars(g2d);
/*补充注释:有些人添加干扰时,喜欢使用随机线条。我认为这个方法一点都不好,不仅是图片极度丑陋,而且根本起不到干扰的作用。*/
//背景上随机10行小字
this.drawSmallChars(g2d);
//添加噪点
int area = (int) (this.getYawpRate() * height * width);
for (int i = 0; i < area; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int rgb = this.getRandomIntColor();
bi.setRGB(x, y, rgb);
}
try {
ImageIO.write(bi, "jpeg", outputStream);
} catch (Exception exc) {
exc.printStackTrace();
}
}
private boolean getRandomBoolean() {
int randInt = random.nextInt(10);
if (randInt > 4) {
return true;
} else {
return false;
}
}
private Color getRandomColor() {
int[] rgb = this.getRandomRgb();
return new Color(rgb[0], rgb[1], rgb[2]);
}
private int getRandomIntColor() {
int[] rgb = this.getRandomRgb();
int color = 0;
for (int c : rgb) {
color = color << 8;
color = color | c;
}
return color;
}
private int[] getRandomRgb() {
int[] rgb = new int[3];
for (int i = 0; i < 3; i++) {
rgb[i] = random.nextInt(255);
}
return rgb;
}
/**
* 返回一个随机汉字字符。
* 采用随机生成两个byte按gb2312编码构成一个String的算法。
* 两个字节在B0A1到D7F9之间,是常用简体字
* 所以,第一个字节在B0(十进制176)到D7(十进制215)之间,第二个字节在A1(十进制161)到F9(十进制249)之间
* @return
*/
protected char getRandomChar() {
final int minFirstByte = 176;
final int maxFirstByte = 215;
final int minSecondByte = 161;
final int maxSecondByte = 249;
byte[] b = new byte[2];
b[0] = (byte) (getRandomIntBetween(minFirstByte, maxFirstByte));
b[1] = (byte) (getRandomIntBetween(minSecondByte, maxSecondByte));
try {
String s = new String(b, "gb2312");
assert s.length() == 1;
return s.charAt(0);
} catch (UnsupportedEncodingException uee) {
//重试
return getRandomChar();
}
}
/**
* 获取两个整数之间的某个随机数,包含较小的整数,不包含较大的整数
* @param first
* @param second
* @return 随机数
*/
private int getRandomIntBetween(int first, int second) {
if (second < first) {
int tmp = first;
first = second;
second = tmp;
}
return random.nextInt(second - first) + first;
}
public int getWidth() {
return width;
}
/**
* 验证码图片的宽度,一般的,宽度应该是高度乘以字符数目
*/
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
/**
* 验证码图片的高度
*/
public void setHeight(int height) {
this.height = height;
}
public OutputStream getOutputStream() {
return outputStream;
}
/**
* 验证码输出地址,如果是在jsp或servlet里使用,这里的outputStream就是从Response对象里获取的outputStream
*/
public void setOutputStream(OutputStream outputStream) {
this.outputStream = outputStream;
}
public int getCharNumber() {
return charNumber;
}
/**
* 生成验证码的字符数量,默认四个
*/
public void setCharNumber(int charNumber) {
this.charNumber = charNumber;
}
public float getYawpRate() {
return yawpRate;
}
/**
* 设定噪声率,既图像上出现的噪声像素占全部像素的比例
* @param yawpRate
*/
public void setYawpRate(float yawpRate) {
this.yawpRate = yawpRate;
}
}
使用该验证码的jsp文件:
Java代码
<%@page contentType="image/jpeg" pageEncoding="UTF-8" import="com.toy.*;"%>
<%
out.clear();
response.reset();
//设定相应头
//不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
int height = 50;//验证码图片高度
int width = 200;//验证码图片宽度
int charNumber = 4;
if(request.getParameter("height") != null){
height = Integer.parseInt(request.getParameter("height"));
}
if(request.getParameter("width") != null){
width = Integer.parseInt(request.getParameter("width"));
}
if(request.getParameter("charnum") != null){
charNumber = Integer.parseInt(request.getParameter("charNumber"));
}
VerifyCode vc = new VerifyCode(width, height);
vc.setCharNumber(charNumber);
vc.setOutputStream(response.getOutputStream());
vc.write();
session.setAttribute("VerifyCode", vc.getVerifyCode());
%>
package com.toy;
import java.util.Random;
import java.io.UnsupportedEncodingException;
import java.io.OutputStream;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.*;
/**
* 一个能生成验证码的类
* 默认四个汉字
* 使用该类生成验证码时
* @author jiangjizhong
*/
public class VerifyCode {
private final Random random = new Random(System.nanoTime());
private int width;
private int height;
private int charNumber = 4;
private float yawpRate = 0.2f; //噪声率
private OutputStream outputStream;
private char[] code;
public VerifyCode() {
//empty
}
/**
* 返回生成的验证码字符串
* @return
*/
public String getVerifyCode(){
return new String(code);
}
public VerifyCode(int width, int height) {
this.width = width;
this.height = height;
}
private void drawPane(Graphics2D g2d){
g2d.setColor(Color.BLACK);
g2d.setStroke(new BasicStroke(2.0f));
g2d.drawRect(0, 0, width, height);
}
private void drawChars(Graphics2D g2d){
float scale = 1f;
int size = (int) (scale * height);
int offsetHeight = (height + size) / 2;
StringBuffer sb = new StringBuffer(1);
sb.setLength(1);
g2d.setColor(Color.BLACK);
code = new char[charNumber];
for (int i = 0; i < charNumber; i++) {
//计算第i个字的x偏移
int offsetWidth = i * size;
//随机大小
int charSize = this.getRandomIntBetween((int) (size * 0.5), size);
//随机样式
int fontStyle = this.getRandomBoolean() ? Font.ITALIC : Font.ITALIC;
g2d.setFont(new Font("隶书", fontStyle, charSize));
//随机颜色
//g2d.setColor(this.getRandomColor());
//随机上移一点
int moveUp = random.nextInt((int) (0.3 * height));
//随机字符
char c = this.getRandomChar();
code[i] = c;
sb.setCharAt(0, c);
g2d.drawString(sb.toString(), offsetWidth, offsetHeight - moveUp);
}
}
private void drawSmallChars(Graphics2D g2d){
final int lines = 5;
int fontSize = this.getHeight() / lines;
int number = this.getWidth() / fontSize;
g2d.setFont(new Font("隶书", Font.PLAIN, fontSize));
g2d.setColor(this.getRandomColor());
for(int i=0; i<10;i++){
StringBuffer sb = new StringBuffer(number);
for(int j=0; j<number; j++){
sb.append(this.getRandomChar());
}
g2d.drawString(sb.toString(), 0, (i + 1) * fontSize);
}
}
/**
* 主要方法,开始生成
*/
public void write() {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bi.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
//画方框9/10期望宽度
this.drawPane(g2d);
//设定字体,字体大小为4/5方框,居中
this.drawChars(g2d);
/*补充注释:有些人添加干扰时,喜欢使用随机线条。我认为这个方法一点都不好,不仅是图片极度丑陋,而且根本起不到干扰的作用。*/
//背景上随机10行小字
this.drawSmallChars(g2d);
//添加噪点
int area = (int) (this.getYawpRate() * height * width);
for (int i = 0; i < area; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int rgb = this.getRandomIntColor();
bi.setRGB(x, y, rgb);
}
try {
ImageIO.write(bi, "jpeg", outputStream);
} catch (Exception exc) {
exc.printStackTrace();
}
}
private boolean getRandomBoolean() {
int randInt = random.nextInt(10);
if (randInt > 4) {
return true;
} else {
return false;
}
}
private Color getRandomColor() {
int[] rgb = this.getRandomRgb();
return new Color(rgb[0], rgb[1], rgb[2]);
}
private int getRandomIntColor() {
int[] rgb = this.getRandomRgb();
int color = 0;
for (int c : rgb) {
color = color << 8;
color = color | c;
}
return color;
}
private int[] getRandomRgb() {
int[] rgb = new int[3];
for (int i = 0; i < 3; i++) {
rgb[i] = random.nextInt(255);
}
return rgb;
}
/**
* 返回一个随机汉字字符。
* 采用随机生成两个byte按gb2312编码构成一个String的算法。
* 两个字节在B0A1到D7F9之间,是常用简体字
* 所以,第一个字节在B0(十进制176)到D7(十进制215)之间,第二个字节在A1(十进制161)到F9(十进制249)之间
* @return
*/
protected char getRandomChar() {
final int minFirstByte = 176;
final int maxFirstByte = 215;
final int minSecondByte = 161;
final int maxSecondByte = 249;
byte[] b = new byte[2];
b[0] = (byte) (getRandomIntBetween(minFirstByte, maxFirstByte));
b[1] = (byte) (getRandomIntBetween(minSecondByte, maxSecondByte));
try {
String s = new String(b, "gb2312");
assert s.length() == 1;
return s.charAt(0);
} catch (UnsupportedEncodingException uee) {
//重试
return getRandomChar();
}
}
/**
* 获取两个整数之间的某个随机数,包含较小的整数,不包含较大的整数
* @param first
* @param second
* @return 随机数
*/
private int getRandomIntBetween(int first, int second) {
if (second < first) {
int tmp = first;
first = second;
second = tmp;
}
return random.nextInt(second - first) + first;
}
public int getWidth() {
return width;
}
/**
* 验证码图片的宽度,一般的,宽度应该是高度乘以字符数目
*/
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
/**
* 验证码图片的高度
*/
public void setHeight(int height) {
this.height = height;
}
public OutputStream getOutputStream() {
return outputStream;
}
/**
* 验证码输出地址,如果是在jsp或servlet里使用,这里的outputStream就是从Response对象里获取的outputStream
*/
public void setOutputStream(OutputStream outputStream) {
this.outputStream = outputStream;
}
public int getCharNumber() {
return charNumber;
}
/**
* 生成验证码的字符数量,默认四个
*/
public void setCharNumber(int charNumber) {
this.charNumber = charNumber;
}
public float getYawpRate() {
return yawpRate;
}
/**
* 设定噪声率,既图像上出现的噪声像素占全部像素的比例
* @param yawpRate
*/
public void setYawpRate(float yawpRate) {
this.yawpRate = yawpRate;
}
}
package com.toy;
import java.util.Random;
import java.io.UnsupportedEncodingException;
import java.io.OutputStream;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.*;
/**
* 一个能生成验证码的类
* 默认四个汉字
* 使用该类生成验证码时
* @author jiangjizhong
*/
public class VerifyCode {
private final Random random = new Random(System.nanoTime());
private int width;
private int height;
private int charNumber = 4;
private float yawpRate = 0.2f; //噪声率
private OutputStream outputStream;
private char[] code;
public VerifyCode() {
//empty
}
/**
* 返回生成的验证码字符串
* @return
*/
public String getVerifyCode(){
return new String(code);
}
public VerifyCode(int width, int height) {
this.width = width;
this.height = height;
}
private void drawPane(Graphics2D g2d){
g2d.setColor(Color.BLACK);
g2d.setStroke(new BasicStroke(2.0f));
g2d.drawRect(0, 0, width, height);
}
private void drawChars(Graphics2D g2d){
float scale = 1f;
int size = (int) (scale * height);
int offsetHeight = (height + size) / 2;
StringBuffer sb = new StringBuffer(1);
sb.setLength(1);
g2d.setColor(Color.BLACK);
code = new char[charNumber];
for (int i = 0; i < charNumber; i++) {
//计算第i个字的x偏移
int offsetWidth = i * size;
//随机大小
int charSize = this.getRandomIntBetween((int) (size * 0.5), size);
//随机样式
int fontStyle = this.getRandomBoolean() ? Font.ITALIC : Font.ITALIC;
g2d.setFont(new Font("隶书", fontStyle, charSize));
//随机颜色
//g2d.setColor(this.getRandomColor());
//随机上移一点
int moveUp = random.nextInt((int) (0.3 * height));
//随机字符
char c = this.getRandomChar();
code[i] = c;
sb.setCharAt(0, c);
g2d.drawString(sb.toString(), offsetWidth, offsetHeight - moveUp);
}
}
private void drawSmallChars(Graphics2D g2d){
final int lines = 5;
int fontSize = this.getHeight() / lines;
int number = this.getWidth() / fontSize;
g2d.setFont(new Font("隶书", Font.PLAIN, fontSize));
g2d.setColor(this.getRandomColor());
for(int i=0; i<10;i++){
StringBuffer sb = new StringBuffer(number);
for(int j=0; j<number; j++){
sb.append(this.getRandomChar());
}
g2d.drawString(sb.toString(), 0, (i + 1) * fontSize);
}
}
/**
* 主要方法,开始生成
*/
public void write() {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bi.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
//画方框9/10期望宽度
this.drawPane(g2d);
//设定字体,字体大小为4/5方框,居中
this.drawChars(g2d);
/*补充注释:有些人添加干扰时,喜欢使用随机线条。我认为这个方法一点都不好,不仅是图片极度丑陋,而且根本起不到干扰的作用。*/
//背景上随机10行小字
this.drawSmallChars(g2d);
//添加噪点
int area = (int) (this.getYawpRate() * height * width);
for (int i = 0; i < area; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int rgb = this.getRandomIntColor();
bi.setRGB(x, y, rgb);
}
try {
ImageIO.write(bi, "jpeg", outputStream);
} catch (Exception exc) {
exc.printStackTrace();
}
}
private boolean getRandomBoolean() {
int randInt = random.nextInt(10);
if (randInt > 4) {
return true;
} else {
return false;
}
}
private Color getRandomColor() {
int[] rgb = this.getRandomRgb();
return new Color(rgb[0], rgb[1], rgb[2]);
}
private int getRandomIntColor() {
int[] rgb = this.getRandomRgb();
int color = 0;
for (int c : rgb) {
color = color << 8;
color = color | c;
}
return color;
}
private int[] getRandomRgb() {
int[] rgb = new int[3];
for (int i = 0; i < 3; i++) {
rgb[i] = random.nextInt(255);
}
return rgb;
}
/**
* 返回一个随机汉字字符。
* 采用随机生成两个byte按gb2312编码构成一个String的算法。
* 两个字节在B0A1到D7F9之间,是常用简体字
* 所以,第一个字节在B0(十进制176)到D7(十进制215)之间,第二个字节在A1(十进制161)到F9(十进制249)之间
* @return
*/
protected char getRandomChar() {
final int minFirstByte = 176;
final int maxFirstByte = 215;
final int minSecondByte = 161;
final int maxSecondByte = 249;
byte[] b = new byte[2];
b[0] = (byte) (getRandomIntBetween(minFirstByte, maxFirstByte));
b[1] = (byte) (getRandomIntBetween(minSecondByte, maxSecondByte));
try {
String s = new String(b, "gb2312");
assert s.length() == 1;
return s.charAt(0);
} catch (UnsupportedEncodingException uee) {
//重试
return getRandomChar();
}
}
/**
* 获取两个整数之间的某个随机数,包含较小的整数,不包含较大的整数
* @param first
* @param second
* @return 随机数
*/
private int getRandomIntBetween(int first, int second) {
if (second < first) {
int tmp = first;
first = second;
second = tmp;
}
return random.nextInt(second - first) + first;
}
public int getWidth() {
return width;
}
/**
* 验证码图片的宽度,一般的,宽度应该是高度乘以字符数目
*/
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
/**
* 验证码图片的高度
*/
public void setHeight(int height) {
this.height = height;
}
public OutputStream getOutputStream() {
return outputStream;
}
/**
* 验证码输出地址,如果是在jsp或servlet里使用,这里的outputStream就是从Response对象里获取的outputStream
*/
public void setOutputStream(OutputStream outputStream) {
this.outputStream = outputStream;
}
public int getCharNumber() {
return charNumber;
}
/**
* 生成验证码的字符数量,默认四个
*/
public void setCharNumber(int charNumber) {
this.charNumber = charNumber;
}
public float getYawpRate() {
return yawpRate;
}
/**
* 设定噪声率,既图像上出现的噪声像素占全部像素的比例
* @param yawpRate
*/
public void setYawpRate(float yawpRate) {
this.yawpRate = yawpRate;
}
}
使用该验证码的jsp文件:
Java代码
<%@page contentType="image/jpeg" pageEncoding="UTF-8" import="com.toy.*;"%>
<%
out.clear();
response.reset();
//设定相应头
//不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
int height = 50;//验证码图片高度
int width = 200;//验证码图片宽度
int charNumber = 4;
if(request.getParameter("height") != null){
height = Integer.parseInt(request.getParameter("height"));
}
if(request.getParameter("width") != null){
width = Integer.parseInt(request.getParameter("width"));
}
if(request.getParameter("charnum") != null){
charNumber = Integer.parseInt(request.getParameter("charNumber"));
}
VerifyCode vc = new VerifyCode(width, height);
vc.setCharNumber(charNumber);
vc.setOutputStream(response.getOutputStream());
vc.write();
session.setAttribute("VerifyCode", vc.getVerifyCode());
%>
发表评论
-
Java SE 6 新特性: Java DB 和 JDBC 4.0
2009-10-11 16:29 11802006 年底,Sun 公司发布了 Java Stan ... -
Java SE 6 Web Service 之旅
2009-10-11 16:17 1840在过去的几个月里,Sun ... -
用Java动态代理实现AOP
2009-10-10 13:38 1000目前整个开发社区对AOP(Aspect Oriented Pr ... -
泛型DAO类设计模式
2009-10-10 11:56 954Generic Data Access Objects ... -
理解ThreadLocal
2009-07-27 22:29 859ThreadLocal是什么 早在JDK ... -
JSON taglib学习笔记
2008-11-04 10:11 1369JSON-taglib 是 JSP 2.0 标签库,用于 ... -
页面生成打开excel(运用poi)
2008-10-29 09:45 1199把excel作为流在页面输出 publ ... -
J2EE使用iText将数据保存为PDF文档
2008-09-18 21:36 1215在B/S结构的项目中,经 ... -
java操作Excel(Jakarta_POI)
2008-09-09 17:22 4014微软在桌面系统上的成 ... -
优化Java中的正则表达式
2008-09-09 14:14 1776如果你花费了数小时和正则表达式做斗争,只是为了让它完成它几秒内 ... -
Java对象池技术的原理及其实现
2008-09-09 09:24 1119Java对象的生命周期分析 Java对象的生命周期大致包括 ... -
jakarta commons logging 的使用方法(续一)
2008-09-08 11:36 860常用log4j配置,一般可以采用两种方式,.propertie ... -
jakarta commons logging 的使用方法(续)
2008-09-08 11:28 1912JCL(Jakarta Commons Logging)和lo ... -
在 Web 应用中增加用户跟踪功能
2008-09-08 11:02 1249随着 Web 应用的复杂化 ... -
在Java应用程序中访问USB设备
2008-09-08 10:48 1191Java 平台一直都以其平台无关性自豪。虽然这种无关性 ... -
正则表达式
2008-09-05 17:29 1197Java代码 检测时间 ([0-1]?[0-9]|2[ ... -
java数字签名
2008-09-05 09:30 2133... -
jakarta commons logging 的使用方法
2008-09-05 09:30 1615日志(Logging)使得我们能够调试和跟踪应用程序任意时刻的 ...
相关推荐
中文验证码识别则是针对含有中文字符的验证码进行解析,增加了识别难度,因为汉字的数量庞大且形状复杂,使得机器识别相较于纯数字或字母的验证码更为困难。 在给定的资源中,我们看到有以下几个关键文件: 1. `cds...
### C#生成中文汉字验证码源码解析 #### 概述 验证码是一种常用的安全措施,用于区分用户是人类...尽管该方案具有一定的复杂度,但对于需要在Web应用程序中集成中文验证码功能的开发者来说,仍具有一定的参考价值。
汉字验证码是一种用于网络安全验证的技术,主要应用于论坛、网站后台等在线平台,以防止恶意自动化的机器人或爬虫程序进行非法操作。它通过显示一个由随机汉字组成的图像,要求用户输入看到的文字来验证其为真实的...
汉字验证码识别尤其具有挑战性,因为它涉及到中文字符的多样性以及图像处理的复杂性。下面将详细介绍图像分割、图像去噪和图像识别这三个关键知识点。 首先,图像分割是验证码识别的第一步,它的目标是将含有文字的...
在ASP中生成汉字验证码是一项常见的安全措施,目的是防止自动化程序(如机器人)进行恶意操作,如注册、登录或提交表单。汉字验证码的使用增加了破解的难度,因为相比纯数字或字母,汉字具有更高的复杂性和多样性。 ...
中文验证码由于其字符集的复杂性,增加了破解的难度,为网站的安全提供了额外的保障。 验证码的核心在于生成一串随机且难以通过机器自动识别的字符。在ASP中实现汉字验证码,我们需要以下几个关键步骤: 1. **汉字...
在中文环境中,中文验证码则是使用中文字符来增加机器识别的难度,从而提高系统安全性。C#是一种广泛应用于Windows平台的面向对象的编程语言,它拥有丰富的库支持,非常适合开发这种类型的应用。 在C#中实现中文...
jsp验证码,jsp中文验证码,数字验证码,汉字验证码
php,验证码,汉字验证码,PHP汉字验证码
【标题】: "适用于各种编程中文汉字验证码制作" 在编程领域,验证码是一种常见的安全机制,用于验证用户身份,防止自动脚本或者恶意机器人进行非法操作。中文汉字验证码因其独特的复杂性和难以被机器识别的特性,...
在这个特定的压缩包文件中,包含的是汉字验证码和字母数字验证码的源码,主要涉及C#和VB.NET两种编程语言。下面将详细介绍这两种验证码类型及其相关技术。 首先,汉字验证码是验证码的一种形式,它由随机选择的汉字...
在asp汉字验证码的实现中,我们不依赖任何外部组件,而是完全通过asp代码来生成和验证汉字验证码。这使得该技术在资源有限的环境中也能有效应用。 创建asp汉字验证码的核心步骤包括以下几个方面: 1. **汉字库选择...
汉字验证码,尤其在中文互联网环境中,由于其语言特性,增加了机器识别的难度,从而提高了系统的安全性。本资源“汉字验证码图10001张”提供了大量的汉字验证码图像,适用于训练计算机视觉和深度学习模型,以提升...
php汉字验证码程序,很好的!~~~~~~~~~
中文验证码是这种验证机制的一个特殊形式,它使用中文字符而非常见的字母或数字来提高系统的安全性。这种类型的验证码增加了机器识别的难度,因为计算机识别中文字符通常比识别拉丁字母或数字更复杂。 验证码的主要...
汉字验证码增加了破解的难度,因为相对于字母和数字,人类对汉字的识别更复杂,而机器识别汉字则更加困难。 首先,生成汉字验证码的关键在于拥有一个汉字库,可以从 Unicode 范围内的汉字中随机选取。Unicode 是一...
中文汉字验证码是验证码的一种形式,其特点是使用中文汉字作为识别内容。这种验证码设计的初衷是为了增加机器识别的难度,因为汉字字符众多且形状复杂,相比数字或字母组合,更不易被自动化程序破解。中文汉字验证码...