我有个image.jsp ,里面随即产生的验证码,保存到session (validate)中。
然后我有个login.jsp页面
String ss=(String)session.getAttirbute("validate");<input type="text" name="ch">
<image src="image.jsp">显示image产生的随机数.然后我验证他在登陆时候 输入的验证码是否正确用 js函数
function validate(a){
  if($('ch').value!=a)
 {
     alert('验证码错误');
     return false;
  }
}
当用户点确认时提交
<input type="submit" value="确认" onClick="return validate('<%=ss%>')">
现在我遇到的问题是,
因为 那随机数 是保存在session中的,
比如用户第一次到login.jspy页面时产生的随机数是 1423
然后我刷新login.jsp页面,页面上显示的是 2235,但是session中的值还是没有改变(1423),
然后用javaScript判断的时候肯定不成立, 我知道是session的问题,但是没什么解决方案,
各位帮忙了....

解决方案 »

  1.   

    为什么session没变呢?
      

  2.   

    恕我直言,看来楼主还完全不理解验证码的使用(貌似很多网站的开发人员均如此)。之所以要验证码,而且还要以图片的方式显示,主要就是为了确保客户端是人工操作。
    为了确保验证码只能被肉眼识别,验证码图片还要故意弄得“乱七八糟”、“杂乱无章”的。因此,是不可能把正确答案再以文本方式放在客户端的。
    若把答案以文本形式发送到客户端,随便写个程序就可以获取到正确答案并轻松通过验证,若如此,还要那样辛辛苦苦弄出来的验证码何用?
    而且,若在客户端进行验证,是有很多种方法可以跳过验证的。如果要使用图片验证码,则肯定是会回到服务器端之后才会验证的。所以,你目前应该采用的正确的做法是:1、把你那句“生成随机数并保存到session中”的代码放到image.jsp中2、login.jsp页面上的相关代码改成:<image src="" id="vimg" onclick="getVimg()" >
    <script>
    function getVimg()
    {
      document.getElementById( "vimg" ).src = "image.jsp?num=" + Math.random();
    }
    getVimg();
    </script>这样,每次你刷新页面或单击图片时,都会重新请求image.jsp页面,你看到的图片与session中所保存的值将会是同样的。3、当表单提交回服务器端后,用reqeust.getParameter( "ch" )得到的值与session中保存的值比较就可以了。
      

  3.   

    在你每次产生随即数的时候要更新session中的值。
      

  4.   

    楼2把简单问题弄杂了,楼3是正解,你要在生成image.jsp中更新session中的validate
      

  5.   

    在生成验证码的页面 image.jsp  里做处理,比如:
     
    //生成随机验证码 
    .....
    String validateCode=....;
    //保存到session
    session.setAttribute("validate",validateCode);//然后在主页面,接收:
    String validateCode= (String) session.getAttribute("validate");
     
      

  6.   

    这个应该是页面加载的问题,我按照楼主的做法做了一下,页面首次加载时根本无法接收到session.getAttribute("validate")的值,而之所以后来取到的都是前一次的验证码,是因为你取session里的验证码时,新的验证码还没有放到session中,这就造成了在客户端验证时产生的错误。如果要解决这个问题,还是应该与服务器交互进行验证,这样就可以避免这种程序运行差异而导致的问题了。
      

  7.   

    <IMG/>标签在jsp页面转化为页面实现类时是原样输出的,所以产生验证码图片是在客户端生成页面后由客户端发出请求才返回的图片,而此时你已经将session.getAttribute("validate")取出来了,当然得到的是前一个验证字符串了,呵呵
      

  8.   

    客户端是不要做任何验证的。否则就有漏洞了。因为验证码只能使用一次。1 你用图片生成验证码,保存在session中
    2 用户输入验证码
    3 服务器端进行比对
    4 无论正确与否,都销毁session里面的验证码!
    OVER,这个才是标准流程
      

  9.   

    不要放到Session里,放到request里就可以了.这样就不会取到前一个验证码.
      

  10.   

    恩放在request里面好点,不过这样你每次跳转页面都要重新验证了
      

  11.   


    9楼正解,你的验证码应该到服务器端取.当前也面的session和image.jsp的session不是一个session.
      

  12.   

    引用 9 楼 java2000_net 的回复:
    客户端是不要做任何验证的。否则就有漏洞了。因为验证码只能使用一次。
    1 你用图片生成验证码,保存在session中
    2 用户输入验证码
    3 服务器端进行比对
    4 无论正确与否,都销毁session里面的验证码!
    销毁session     调用session.invalidate()
      

  13.   

      仔细看了各位的建议,还是有点疑问, 首先我登陆login.jsp中。 页面加载的时候, <image src="image.jsp">   调用image.jsp,然后把随机码 保存在  session中,
      session.setAttribute("aa",aa);  比如现在的验证码是  1222
      然后 当用户 觉得找个页面上的随机码 看不清楚,刷新login.jsp页面,(这个时候我多没提交..) 
      我想此时 login.jsp中的<image src="image.jsp"> 再次调用了,就是说重新生成了验证码,请注意这个时侯 login.jsp中的页面上,显示的是一个新的 验证码了,比如 3434
      比如说刷新login.jsp这个页面N 次,页面上显示的是不同的验证码
        但是最让我头疼的是,那个 aa 保存的 还是第一次 login.jsp加载的时候 产生的随机数 1222......
       也不知道我这么说各位能否明白....
      

  14.   

    2楼正解~对这个问题我也不太会,关注ing~
      

  15.   


    校验 验证码的问题我已经解决了,在服务器做的验证,
    说下我的解决方案,当他提交的时候我在 action 得到image.jsp中的session,然后在得到login.jsp中文本框的值,进行判断,不相等就 String s="输入的验证码不正确";
    session.setAttribute("aa",s) reutrn mapping.findForward() 到login.jsp
    String  a =(String)session.getAttribute("a");
    session.removeAttribute("a");
    然后用个js函数 ,在body 加载的时候就调用 <body onload="onloadings(<%=a%>)">
    function  onlodings(a){
     if(a==null||a==""){
     }else{ 
      alert(a);
    }
    }
    上面解决了我的问题.....
    但是我在做这个校验中还是有点疑惑
    1 : 假设第一次加载 login.jsp中的时候 <image src="image.jsp">显示的是 1235,我在image.jsp中输出随机生成的验证码 也是 1235,保存的在session中,但是在login.jsp中用<%String s=(String)session.getAttribute("aa")%> 读出来的却是null,然后我又刷新login.jsp 这个时侯 s 就是1235,它总是保存上一次的验证码,无论刷新多少次它总是保存你上一次显示在login.jsp中的验证码,第一次是空.
      

  16.   

     第一次加载 login.jsp中的时候 用 <%String s=(String)session.getAttribute("random")%> 读出来的却是null,然后我又刷新login.jsp 这个时侯 s 就是第一次的验证码,它总是保存上一次的验证码,无论刷新多少次它总是保存你上一次显示在login.jsp中的验证码,第一次是空. 我也碰到这样的问题,真希望高人能帮我解决