public class ImageEnsure { 
public ImageEnsure(){ } 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 getEnsure(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_BGR); 
//获取图形上下文 
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())]; 

//将认证码显示到图像中 
g.setColor(Color.red); 
g.setFont(new Font("Atlantic Inline",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); 
//随机产生100个干扰点 
Random rand=new Random(); 
for(int i=0;i<100;i++) 

int x=rand.nextInt(width); 
int y=rand.nextInt(height); 
g.drawOval(x, y, 1, 1); 

//释放图形上下文 
g.dispose(); 
try{ 
//输出图像到页面 
ImageIO.write(image, "JPEG", os); 
}catch(IOException e){ 
return ""; 

return strEnsure; 


//调用javabean的页面 
<jsp:useBean id="image" scope="page" class="myBean.ImageEnsure"/> 
<% 
String str=image.getEnsure(0,0,response.getOutputStream()); 
session.setAttribute("strEnsure",str); 
%> 我把session里的strensure读出来看,发觉和显示的不一样,仔细看,session里存的是上一个显示出来的验证码,也就是说图片显示的是“1234”,刷新一次页面后显示“5678”,但session里的是1234,存的是上次显示的码