验证码是在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,页面仍然认为是原来请求的那个,所以得到的session也是原来的.你试试request.getSession()改成session看看;
------解决方案--------------------
这个是你不同步的问题,页面和图片同时访问SESSION,由于JSP先运行,先访问SESSION,获得的是上一次SESSION,在页面显示图片时SERVLET才运行,此时SERVLET生成一个新的代码。