一个用servlet写的验证码,在登录页面时是可以显示出来且可以刷新的,当验证码输入错误并提交服务器或正确登录系统后再退出系统返回到登录页面时,验证码却显示不出来,这是什么原因?头一次碰到这样的问题,郁闷,望高手指点下

解决方案 »

  1.   

    servlet中加入这个。

    // 设置页面不缓存
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);
      

  2.   

    private static int WIDTH = 60;   
        private static int HEIGHT = 20;   
        public void doGet(HttpServletRequest request,HttpServletResponse response)    
                throws ServletException,IOException   
        {          
            HttpSession session = request.getSession();   
            response.setContentType("image/jpeg");   
            ServletOutputStream sos = response.getOutputStream();   
      
            //设置浏览器不要缓存此图片   
            response.setHeader("Pragma","No-cache");   
            response.setHeader("Cache-Control","no-cache");   
            response.setDateHeader("Expires", 0);   
               
            //创建内存图象并获得其图形上下文   
            BufferedImage image =    
                new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);    
            Graphics g = image.getGraphics();   
               
            //产生随机的认证码   
            char [] rands = generateCheckCode();   
               
            //产生图像   
            drawBackground(g);   
            drawRands(g,rands);   
               
            //结束图像的绘制过程,完成图像   
            g.dispose();   
               
            //将图像输出到客户端   
            ByteArrayOutputStream bos = new ByteArrayOutputStream();   
            ImageIO.write(image, "JPEG", bos);   
            byte [] buf = bos.toByteArray();   
            response.setContentLength(buf.length);   
            //下面的语句也可写成:bos.writeTo(sos);   
            sos.write(buf);   
            bos.close();   
            sos.close();   
      
            //将当前验证码存入到Session中   
            session.setAttribute("rand",new String(rands));   
            //直接使用下面的代码将有问题,Session对象必须在提交响应前获得   
            //request.getSession().setAttribute("check_code",new String(rands));   
        }   
           
        private char [] generateCheckCode()   
        {   
            //定义验证码的字符表   
            String chars = "0123456789abcdefghijklmnopqrstuvwxyz";   
            char [] rands = new char[4];   
            for(int i=0; i<4; i++)   
            {   
                int rand = (int)(Math.random() * 36);   
                rands[i] = chars.charAt(rand);   
            }   
            return rands;   
        }   
           
        private void drawRands(Graphics g , char [] rands)   
        {   
            g.setColor(Color.BLACK);   
            g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));   
            //在不同的高度上输出验证码的每个字符        
            g.drawString("" + rands[0],1,17);   
            g.drawString("" + rands[1],16,15);   
            g.drawString("" + rands[2],31,18);   
            g.drawString("" + rands[3],46,16);   
            System.out.println(rands);   
        }   
           
        private void drawBackground(Graphics g)   
        {   
            //画背景   
            g.setColor(new Color(0xDCDCDC));   
            g.fillRect(0, 0, WIDTH, HEIGHT);   
            //随机产生120个干扰点   
            for(int i=0; i<120; i++)   
            {   
                int x = (int)(Math.random() * WIDTH);   
                int y = (int)(Math.random() * HEIGHT);   
                int red = (int)(Math.random() * 255);   
                int green = (int)(Math.random() * 255);   
                int blue = (int)(Math.random() * 255);   
                g.setColor(new Color(red,green,blue));         
                g.drawOval(x,y,1,0);   
            }   
        }
      

  3.   

    呵呵,我这里写的验证码都可以,不管怎么返回都可以显示,应该跟浏览器没有关系吧,可能就是public class AuthImage extends HttpServlet   
    {   
      
        private static final String CONTENT_TYPE = "text/html; charset=gb2312";   
        //设置字母的大小,大小   
        private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);   
        public void init() throws ServletException   
        {   
            super.init();   
        }   
        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, 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(mFont);   
      
            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 xl = random.nextInt(6) + 1;   
                int yl = random.nextInt(12) + 1;   
                g.drawLine(x,y,x + xl,y + yl);   
            }   
      
            //从另一方向画随机线   
            for (int i = 0;i < 70;i++)   
            {   
                int x = random.nextInt(width - 1);   
                int y = random.nextInt(height - 1);   
                int xl = random.nextInt(12) + 1;   
                int yl = random.nextInt(6) + 1;   
                g.drawLine(x,y,x - xl,y - yl);   
            }   
      
            //生成随机数,并将随机数字转换为字母   
            String sRand="";   
            for (int i=0;i<6;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());   
        }   
        public void destroy()   
        {   
        }   
    }可能是缺少了方法,或者是缺少存储区域处理,这个可以用,你看看
      

  4.   

    <img src="/servlet/code" /> 这样调,在看看.
    如果你直接输出的返回时输出代码没被调用.