有一产生验证码rand.jsp页面:
<%!
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);// 在内存中创建图象
int width=46, height=16;
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));//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 随机产生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=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,11*i+1,12);
}session.setAttribute("rand",sRand);//session保存rand// 图象生效
g.dispose();// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
%> 登陆页面index.jsp:<body>
<form action="<%=request.getContextPath()%>/login.do" name="loginform"  method="post">
  <table>
   <tr>
      <td>用户:<input type=textbox  name="username" value="" /></td>
   </tr>
   <tr>
      <td>密码:<input type=password name="password" value="" /></td>
   </tr>
   <tr>
      <td>验证码:<input type=textbox  name="randt"  value=""  />
                  <img border=0 src="rand.jsp" >
      </td>
   </tr>
   <tr>
      <td>
          <input type=submit value="登陆" name="loginsub" >
     <input type=reset  value="重写" name="loginres" >
     </td>
    </tr>
        <%=session.getAttribute("rand") %>
      </table>
</body>
    为什么这里的session.getAttribute("rand") 的值 和 <img border=0 src="rand.jsp>的值显示出来的不一样呢? session.getAttribute("rand") 显示的是 <img border=0 src="rand.jsp>的前一个值,如果是第一次 session.getAttribute("rand") 显示的是null,而<img border=0 src="rand.jsp>却有值
    但是在LoginAction中 
         session.getAttribute("rand");
    String rand = (String)session.getAttribute("rand");
    String randt= forms.getRandt() ;
    if(randt.equals(rand))
     {相等}
         else{不等}
却是相等的,但是有时候前1、2次填写的时候会提示不等,刷新几次再填则相当了。请教各位大侠,这是什么原因啊?先谢谢了!

解决方案 »

  1.   

    yifuzhiming(haha) 验证玛的程序确实不是我写的,我只是问下我在使用时碰到的问题,不可以么?
    我就不懂了,你这人说话怎么这么尖酸刻薄呢?
      

  2.   

    getAttribute 
    getAttribute
    得到的setAttribute传过来的值什么时候set的呢,上次页面(或控制程序,or XXlistener)~~
      

  3.   

    应该是jsp页面解释顺序的问题吧,我觉得是 session.getAttribute("rand") 在翻译阶段就执行了, <img border=0 src="rand.jsp> 是在请求处理阶段执行的,所以2个值看起来总是差一步。
    后面的 LoginAction 中相等也是应该的,至于为什么会有1,2次不相等。。会不会是你看错了或者写错了啊。
    总的来说代码应该没有什么问题吧
      

  4.   

    iu007(来自北方的狼) 先谢谢一个! session.getAttribute("rand") 和 <img border=0 src="rand.jsp>的值就是差一步!
    确实会有第一次不相等,因为LoginAction里的session是在HttpServletRequest.getsession()的时候才创建,而第一次显示的rand session是 HttpServletRequest.getsession()没有执行,所以才回出现这个问题吧?
    我是这样理解的,不知我对了没有?还请各位指教。
      

  5.   

    session.getAttribute("rand") 和 <img border=0 src="rand.jsp>的值就是差一步;
    第一次不相等;
    这些问题该怎么解决呢?
    这样写还有一个问题就是:当你成功登陆后,再次刷新页面,就会出现验证码不相等情况,如何避免这个情况呢?