在用Ajax实现图片验证码时,都是<img src="servlet名"> ,这样就能访问到对应的servlet。不知道其中的原理。求助求助img src servlet名

解决方案 »

  1.   

    servlet会返回一个图片的名字,浏览器根据图片名字再到服务器端取这个图片。
    这样算来来回各跑了两趟?
      

  2.   

    servlet使用java gui api生成图片,得到图片二进制字节流,返回浏览器渲染
      

  3.   


    确实是跑了两次,在IE7中就把那个servlet执行了两次,但是再firefox中就只执行了一次servlet。
    但是这个过程浏览器是具体怎么执行的呢?
      

  4.   

    <img src="servlet名">浏览器是如何解析的呢?
      

  5.   

    1.servlet生成一个图片
    2.你直接输入servlet的连接看一下,就是一个图片,和我们自己发布到服务器的一样。
    3.页面加载时,会访问这个servelt连接,自然就会生成一个图片
      

  6.   

    这要看你src="servlet名"里的servlet是给谁用的了。也就是给服务器,还是浏览器。
      

  7.   

    servlet中输出一个流(java.io.InputStream )就可以了,private char mapTable[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

    /**
     * 生成随机的注册验证码图像
     * @param request
     * @param response
     * */
    public void bringCode(HttpServletRequest request, HttpServletResponse response) {
    try {
    int width = 65, height = 24;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics graphics = image.getGraphics();// 获取图形上下文
    graphics.setColor(getRandColor(180, 250));// 设定背景色(最多色调255)
    graphics.fillRect(0, 0, width, height);
    graphics.setColor(Color.black);// 画边框
    graphics.drawRect(0, 0, width - 1, height - 1);
    String randCode = "";// 取随机产生的认证码
    for (int i = 0; i < 4; ++i) {// 4代表4位验证码,如果要生成更多位的认证码,则加大数值
    randCode += mapTable[(int) (mapTable.length * Math.random())];
    }
    graphics.setColor(Color.black);// 将认证码显示到图像中,如果要生成更多位的认证码,增加drawString语句
    graphics.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
    String str = randCode.substring(0, 1);
    graphics.drawString(str, 8, 17);
    str = randCode.substring(1, 2);
    graphics.drawString(str, 20, 15);
    str = randCode.substring(2, 3);
    graphics.drawString(str, 35, 18);
    str = randCode.substring(3, 4);
    graphics.drawString(str, 45, 15);
    Random rand = new Random();// 随机产生30个干扰点
    for (int i = 0; i < 30; i++) {
    int x = rand.nextInt(width);
    int y = rand.nextInt(height);
    graphics.drawOval(x, y, 1, 1);
    }
    graphics.dispose();// 释放图形上下文
    request.getSession().setAttribute(FrameConfig.checkCode, randCode);// 认证码保存在session中
    OutputStream output = response.getOutputStream();
    ImageIO.write(image, "JPEG", output);// 输出图像到页面
    image.flush();
    output.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    关键代码:
    ImageIO.write(image, "JPEG", output);// 输出图像到页面