生成验证码图片的jsp页面
时间:2008-10-27 来源:yong_kang
<%@ page contentType="image/jpeg"%>
<%@ page import="java.awt.Font,
java.awt.Color,
java.util.Random,
java.awt.Graphics,
java.io.OutputStream,
javax.imageio.ImageIO,
java.awt.image.BufferedImage"%>
<%!
private int type = 0; //类型:0 字母数字, 1 数字;
private static final String IMAGE_SESSION_ATTRIBUTE = "TEMP_IMAGE"; //初始化随机数表
private static char c[] = new char[62];
static{
for (int i=97, j=0; i<123; i++, j++) {
c[j] = (char) i;
}
for (int o=65, p=26; o<91; o++, p++) {
c[p] = (char) o;
}
for (int m=48, n=52; m<58; m++, n++) {
c[n] = (char) m;
}
} //给定范围获得随机颜色
private Color getRandColor(int fc, int bc){
Random random = new Random();
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);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); //在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //获取图形上下文
Graphics g = image.getGraphics(); //生成随机类
Random random = new Random(); //设定背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height); //设定字体
g.setFont(new Font("Times New Roman", Font.PLAIN,18)); //随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160, 200));
for (int i=0; i<155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x+xl, y+yl);
}
//取随机产生的认证码(4位数字)
String sRand = "";
for (int i=0; i<4; i++){
String rand = null;
if(0 == type){
int x = random.nextInt(62);
rand = String.valueOf(c[x]);
}else{
rand = String.valueOf(random.nextInt(10));
}
sRand += rand;
//将认证码显示到图象中
g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110)));
//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand, 13*i+6, 16);
}
//将认证码存入SESSION
///session.setAttribute(IMAGE_SESSION_ATTRIBUTE, sRand);
session.setAttribute("zxfk",sRand);
//图象生效
g.dispose();
OutputStream os = response.getOutputStream();
//输出图象到页面
ImageIO.write(image, "JPEG", os);
os.flush();
os.close();
os = null; response.flushBuffer();
out.clear();
out = pageContext.pushBody();
%>
<img title="请在前面的输入框中输入此处显示的数字" src="/admin/admin/tokenimage.jsp">
<%@ page import="java.awt.Font,
java.awt.Color,
java.util.Random,
java.awt.Graphics,
java.io.OutputStream,
javax.imageio.ImageIO,
java.awt.image.BufferedImage"%>
<%!
private int type = 0; //类型:0 字母数字, 1 数字;
private static final String IMAGE_SESSION_ATTRIBUTE = "TEMP_IMAGE"; //初始化随机数表
private static char c[] = new char[62];
static{
for (int i=97, j=0; i<123; i++, j++) {
c[j] = (char) i;
}
for (int o=65, p=26; o<91; o++, p++) {
c[p] = (char) o;
}
for (int m=48, n=52; m<58; m++, n++) {
c[n] = (char) m;
}
} //给定范围获得随机颜色
private Color getRandColor(int fc, int bc){
Random random = new Random();
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);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); //在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //获取图形上下文
Graphics g = image.getGraphics(); //生成随机类
Random random = new Random(); //设定背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height); //设定字体
g.setFont(new Font("Times New Roman", Font.PLAIN,18)); //随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160, 200));
for (int i=0; i<155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x+xl, y+yl);
}
//取随机产生的认证码(4位数字)
String sRand = "";
for (int i=0; i<4; i++){
String rand = null;
if(0 == type){
int x = random.nextInt(62);
rand = String.valueOf(c[x]);
}else{
rand = String.valueOf(random.nextInt(10));
}
sRand += rand;
//将认证码显示到图象中
g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110)));
//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand, 13*i+6, 16);
}
//将认证码存入SESSION
///session.setAttribute(IMAGE_SESSION_ATTRIBUTE, sRand);
session.setAttribute("zxfk",sRand);
//图象生效
g.dispose();
OutputStream os = response.getOutputStream();
//输出图象到页面
ImageIO.write(image, "JPEG", os);
os.flush();
os.close();
os = null; response.flushBuffer();
out.clear();
out = pageContext.pushBody();
%>
<img title="请在前面的输入框中输入此处显示的数字" src="/admin/admin/tokenimage.jsp">
相关阅读 更多 +