日期:2014-05-17  浏览次数:20849 次

第一次发帖子,新手求助 关于验证码的问题
这是我写的生成验证码的类:


package com.shopping.code;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;

/**
 * 生成验证图片类
 * 
 * @author acer
 * 
 */
public class image {
//验证码中可以出现的字符集
private char mapTable[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9' };

public String getCodeImage(int width,int height,OutputStream os){
if(width<=0){
width=60;
}
if(height<=0){
height=20;
}
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

//获取图形上下文
Graphics g=image.getGraphics();
//设定背景颜色
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);

//画边框
g.setColor(Color.black);
g.drawRect(0,0,width-1,height-1);

//产生随机的验证码
String strEnsure="";

//4代表4位验证码,如需要产生更多的,请增大数值
for(int i=0;i<4;i++){
strEnsure+=mapTable[(int)(mapTable.length*Math.random())];
}
//将认证码显示到图像中,如果要生成更多位的验证码,增加DRAWSTRING 语句
g.setColor(Color.black);
g.setFont(new Font("AtlanticInline",Font.PLAIN,18));
String str=strEnsure.substring(0,1);
g.drawString(str,8,17);
str=strEnsure.substring(1,2);
g.drawString(str,20,15);
str=strEnsure.substring(2,3);
g.drawString(str,35,18);
str=strEnsure.substring(3,4);
g.drawString(str,45,15);

//释放图形上下文
g.dispose();

try{
ImageIO.write(image, "jpeg",os);
 
}catch(IOException e){
return " ";
}

return strEnsure;

}

}

这是我在JSP里面读取验证码的 代码

<%String str=image.getCodeImage(0,0,response.getOutputStream());
out.clear();
out = pageContext.pushBody();
session.setAttribute("imageCode",str);
%>
然后运行页面之后就乱码,什么错也不报

求大神指教 
------解决方案--------------------
编码问题,把你的servlet中request和response编码设置成和你的jsp中编码格式一样试试

------解决方案--------------------
不是设置编码,应该是要设置 content type 为 image/jpeg。
另外顺便你这用jsp何必呢绕来绕去,用个servlet多好