解决方案 »

  1.   

    新的验证码在后台产生后,应该没有及时放进session中去吧,如果放进去了,拿到的应该是新的验证码
    检查下,新的验证码出来后,怎么存放的?有没有放进session中,替换老的验证码
      

  2.   

    同上,肯定是新的验证码生成后,没有立刻放到session中
      

  3.   

    在产生图片的同时将验证码存在session中
      

  4.   

    我单独弄了几个网页验证验证码都是正常的,但我在项目里面session总是慢一步
      

  5.   

    在验证码生成页面就已经将图片保存进去了啊,但就是显示的时候session还是上一个
      

  6.   

    检查你项目里面的session的代码,看看session数据走向。
    看看项目中session的存取数据跟你的单独网页的session有什么差异
    或者 在项目中打断点,从验证码产生,放进session开始,跟踪一下session中的验证码
      

  7.   


    在验证码生成页面就已经将图片保存进去了啊,但就是显示的时候session还是上一个
      

  8.   

    这是验证码生成页面,,,image.jsp<%@ page contentType="image/jpeg" language="java" import="java.util.*,java.awt.*,java.awt.image.*,javax.imageio.*" pageEncoding="utf-8"%>  
      
    <%!  
        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-catch");  
        response.setDateHeader("Expires",0);  
          
        //在内存中创建图象  
        int width = 150;  
        int height = 50;  
        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("Tines Nev Roman",Font.PLAIN,30));  
        //随机产生干扰线  
        g.setColor(getRandColor(160,200));  
        for(int i = 0; i < 255; i++){  
            int x = random.nextInt(width);  
            int y = random.nextInt(height);  
            int xl = random.nextInt(12);  
            int yl = random.nextInt(12);  
        }  
        //随机产生认证码,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,30*i+6,35);  
        }  
        session.setAttribute("rCode",sRand);  
        
        //图像生效  
        g.dispose();  
        //输出图像到页面  
        ImageIO.write(image,"JPEG",response.getOutputStream());  
        out.clear();  
        out = pageContext.pushBody(); 
        
        
        
    %>  
    这是前台显示调用验证码图片代码
    <label for="image">验证码</label>

    <input type="text" id="image" name="image" placeholder="请输入验证码" style="width:200px;float:left;">
    <span id="num" style="color:red"></span>

    <% 
    String rand = (String)request.getSession().getAttribute("rCode");
    String input = request.getParameter("rand");
    %>
    <%= rand %>

    <a href="#"><img alt="看不清,点击换一张" src="image.jsp" style="float:right;margin-top:-5px;" onClick="this.src=this.src+'?';return false;" >
    </a>中间那段Java就是我获取当前的session验证码
      

  9.   

    感觉没问题,你把这个放在图片请求下试试<% 
                        String rand = (String)request.getSession().getAttribute("rCode");
                        String input = request.getParameter("rand");
                        %>
                        <%= rand %>
      

  10.   

    没看出什么问题
    session.setAttribute("rCode",sRand);  
    打印下验证码,看是多少?String rand = (String)request.getSession().getAttribute("rCode");
    上面一行是后才存放的验证码吧,打印下验证码String input = request.getParameter("rand");
    这一行代码是什么作用呢?
      

  11.   


    刚打印了一下,前台显示的验证码跟生成验证码是一样的,就是前台那里调用session总是慢一步
      

  12.   

    不介意的话换一种输出方式吧 
    1.图片压缩输出response.setContentType("image/jpeg");
    OutputStream ops = response.getOutputStream();
    //write方法:将原始图片(image)使用
    ImageIO.write(image, "jpeg", ops);
    ops.close();2.jsp页面<h3>验证码:<h3/>
    <img id="num" src="checkcode" />
    <a href="javascript:;" onclick="document.getElementById('num').src = 'checkcode?'+Math.random()">换一张</a>src=“checkcode”中换成你在xml中配置的生成验证码的servlet
      

  13.   

    楼主你绑定session 这步session.setAttribute("rCode",sRand);  
    少了HttpSession session =request.getSession();没报错?
      

  14.   

    跟你说说吧,你所做的验证方式本身就是错误的。至于错误的原因我会在下面给你解释:
    1. 你的页面输出验证码明文的时候,你的新验证码还没有被生成,因为图片时在HTML页面加载后才访问的,也就是说你已经把验证码输出到页面了才又去访问的验证码生成功能,所以不论你怎么做,显示的都肯定是上一次的。
    2.给你的建议是单独做一个页面用于显示后台验证码,该页面在验证码图片显示完成后你手动刷新下就行了。
      

  15.   

    同意16楼,web项目建议你写个生成验证码的servlet,页面调用就行了