日期:2014-05-18  浏览次数:20691 次

验证码和session不同步
验证码是在servlet中生成的,然后就放到session中,可页面取的时候怎么老是和servlet中的session不同步,也就是页面显示的验证码和从页面取出的验证码不一样,而且页面取出的总是上一次显示的,比如第一次显示的是 "123 ",这时取出来的就不是“123”,刷新页面后再从session中取,取出来的才是 "123 ",也就是说在页面从session中取出来的验证码总是比显示的验证码慢一拍,这是怎么回事???
另外servlet贴出来:

public   class   AuthImg   extends   HttpServlet   {
private   static   final   String   CONTENT_TYPE= "text/html;charset=gb2312 ";
private   Font   font=new   Font( "Times   New   Roman ",Font.PLAIN,17);

public   void   init()   throws   ServletException{
super.init();
}

public   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);
}

public   void   service(HttpServletRequest   request,HttpServletResponse   response)throws   ServletException,IOException{
response.setHeader( "Pragma ", "No-cache ");
response.setHeader( "Cache-Control ", "no-cache ");
response.setDateHeader( "Expires ",0);
response.setContentType( "image/jpeg ");
int   width=100;
int   height=18;
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(1,1,width-1,height-1);
g.setColor(new   Color(102,102,102));
g.drawRect(0,0,width-1,height-1);
g.setFont(font);
g.setColor(getRandColor(160,200));
for(int   i=0   ;i <155;i++){
int   x=random.nextInt(width-1);
int   y=random.nextInt(height-1);
int   x1=random.nextInt(6)+1;
int   y1=random.nextInt(12)+1;
g.drawLine(x,y,x+x1,y+y1);
}
for(int   i=0   ;i <70;i++){
int   x=random.nextInt(width-1);
int   y=random.nextInt(height-1);
int   x1=random.nextInt(12)+1;
int   y1=random.nextInt(6)+1;
g.drawLine(x,y,x+x1,y+y1);
}
String   rand= " ";
for(int   i=0;i <6;i++){
int   itmp=random.nextInt(26)+65;
char   ctmp=(char)itmp;
rand+=String.valueOf(ctmp);
g.setColor(new   Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(String.valueOf(ctmp),15*i+10,16);
}
HttpSession   session=request.getSession(true);
session.setAttribute( "rand ",rand);
g.dispose();
ImageIO.write(image, "JPEG ",response.getOutputStream());

System.out.println(request.getSession().getAttribute( "rand "));
}

public   void   destroy(){

}
}


------解决方案--------------------
这个问题我刚遇到过~实际上是同步的~
你刷新的时候,session显示的是上一个值~
而你提交服务的时候session又被赋予验证码所显示的值了~
出现问题也许是你验证码与你session值比较方式出现的问题~
------解决方案--------------------
总之我知道一点,当页面显示以后,session中的验证码和图片显示的是一样的.
至于你说的问题:我估计jsp中request,页面仍然认为是原来请求的那个,所