大家元旦快乐~~~
为什么在JSP页面上做了个验证码的servlet,把生成的验证码存入到session中。然后在这个JSP中<%=session.getAttribute("rand") %>返回的总是上次生成的验证码呢?而不是运行时页面上显示的验证码。整个session获得的参数都延迟了。
这里是生成验证码的servlet部分代码:
HttpSession session = request.getSession(true);
        session.setAttribute("rand",sRand);
        g.dispose();
        ImageIO.write(image, "JPEG", response.getOutputStream());

解决方案 »

  1.   

    补充一下代码,authimage就是生成验证码的servlet:
    JSP:
    <tr bgcolor=#ffffff>
                                  <td height=25 align="left" class="writer">验 证 码:</td>
                                  <td width="60" align="left" class="writer"><input class=input_sr maxlength=4 size=6 name=passcode2>
                                  </span></td>
                                  <td width="320" align="left" class="writer" style="PADDING-LEFT: 5px"><span class="writer" style="PADDING-LEFT: 5px"><img src="authImage" width="70" height="18"></span></td>
                                </tr>
                                <tr>
                                  <td align="left" height="35"></td>
                                  <td colspan="2" align="left">
                                  <input type="hidden" name="code" value="<%=session.getAttribute("rand") %>"/>
                                  <input name="Submit" type="button" value="提交" onclick="checkleavemessage()">
                                      <input name="Submit2" type="reset" value="重置"></td>
                                </tr>
    生成验证码的servlet:
    //生成随机数,并将随机数字转换为字母
    …………………………
            String sRand="";
            for (int i=0;i<4;i++)
            {
                int itmp = random.nextInt(26) + 65;
                char ctmp = (char)itmp;
                sRand += 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",sRand);
            g.dispose();
            ImageIO.write(image, "JPEG", response.getOutputStream());
      

  2.   

    document.getElementById(id).src='验证码图片路径?aaaa=' + new Date().getTime();
      

  3.   

    楼上的代码是JS的吧?aaaa所指的是??????看不明啊,劳烦解释一下行吗?
      

  4.   

    可能是因为在插入验证码前重复调用保存验证码的那个Session变量
    造成在显示验证码时Session变量不能同步问题。
      

  5.   

    因为你这次的生成的session 并没有保存上你现在的验证码。可能是因为在同一个页面 并没有进行页面刷新吧
      

  6.   

    你第一次生成的验证码是在session当中存放的,session是一个会话啊,所以第二次用的时候还是原来的值。
      

  7.   

    刚刚检查了下在之前并没有调用到那个验证码的servlet也没有调用到那个session,整个项目就差这一步了,到底是什么原因啊。难道执行原理是先把整个JSP页面编译完再编译其中的servlet?
      

  8.   

    请问是不是只有页面刷新才能得到被修改过的session中的变量?即使调用该servlet之后再来调用在servlet中设置的session也无效?有没有什么办法解决这个问题啊,感激不尽
      

  9.   

    document.getElementById(id).src='验证码图片路径?aaaa=' + new Date().getTime();
    src =''其中填写的应该是调用验证码的servlet吧,你是怎么写的啊????
      

  10.   

    本人还不是很会使用JS,不过使用了用alert显示出来还是延迟的。还有经过试验发现是整个JSP页面执行完了再回头去执行那个生成验证码的servlet,请问有没有什么办法可以实现servlet在被调用的时候立即执行,执行完毕之后再回头去继续执行那个发出调用的JSP呢?
      

  11.   


    那先执行完servlet再通过servlet跳去页面也行吧
      

  12.   


    那先执行完servlet再通过servlet跳去页面也行吧
      

  13.   

    在java类里取就不会有这种问题
      

  14.   

    因为浏览器总是先请求页面, 然后再请求图片JSP 比 Servlet 先执行了
    JSP 里当然只能拿到上一次的了