为什么Internet Explorer在某些情况下会多次加载一个图像?

时间:2012-08-29 04:01:04

标签: php image internet-explorer captcha limesurvey

我有一个带按钮的简单表格。按下按钮在PHP页面上调用GET。在页面上只有一个IMG标记,其中SRC是一个动态返回PNG图像的PHP脚本(imagepng()函数)。

为什么Internet Explorer 9会多次加载此图像?

验证发生这种情况可能有点棘手。我发现这是因为我正在使用PHPEd调试PHP脚本(生成PNG的脚本),并意识到流在文件中输入两次,在断点上停止两次!

当我查看IE的网络日志时,我确认了这一点,并发现确实有多个调用脚本。要查看网络日志,请在IE窗口中按F12,然后单击“网络”选项卡。

根据日志,有一个未完全完成的调用(不返回HTTP 200状态),但这足以使所有内容混乱。

有关如何解决此问题的任何建议?

我已经做了一些示例脚本来演示这个问题:

档案“teste.php”

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <title>Problem</title>
  </head>
  <body>
<?php 
  $handle = fopen("teste.txt", "w");
  fclose($handle);  
?>
    <img src="verification.php" alt="captcha">
    <form action="teste.php" method="get">
      <input type="submit" value="Go!">
    </form>
  </body>
</html>

档案“verification.php”

<?php
  $im = imagecreatetruecolor(75, 20);
  $black = ImageColorAllocate($im, 0, 0, 0);
  $red = ImageColorAllocate($im, 255, 0, 0);
  $blue = ImageColorAllocate($im, 0, 0, 255);
  $grey_shade = ImageColorAllocate($im, 204, 204, 204);

  srand((double)microtime()*1000000);

  $num1 = rand(1,5);

  $found = false;

  while (!$found) {
    $num2 = rand(1,100);

    if (preg_match('/^[0-9]+$/', $num2/5)) {
      $found = true;
      break;
    }
  }

  $font_c_rand = rand(1,3);

  if ($font_c_rand == 1) {
    $font_color = $black;
  } else if ($font_c_rand == 2) {
    $font_color = $red;
  } else if ($font_c_rand == 3) {
    $font_color = $blue;
  }

  $font = "vera.ttf";

  $line_rand = rand(1,3);

  if ($line_rand == 1) {
    $line_color = $black;
  } else if ($line_rand == 2) {
    $line_color = $red;
  } else if ($line_rand == 3) {
    $line_color = $blue;
  }

  ImageFill($im, 0, 0, $grey_shade);
  imageline($im,0,0,0,20,$line_color);
  imageline($im,74,0,74,19,$line_color);
  imageline($im,0,0,74,0,$line_color);
  imageline($im,0,19,74,19,$line_color);
  ImageTTFText($im, 10, 0, 3, 15,$font_color, $font,  $num1." + ".$num2." =" );


  imagepng($im);
  imagedestroy($im);

  $handle = fopen("teste.txt", "a");
  fwrite($handle, "\"verification.php\ executed!". The sum result is " . ($num1 + $num2) ."\n");
  fclose($handle);  
?>

如您所见,您将需要一个ttf字体。将相同的文件夹放在同一个文件夹中,然后在上面的脚本中查找$ font变量。您可以使用任何True Type字体,看看:

  

$ font =“arial.ttf”;

唯一的要求是ttf文件必须位于脚本的同一文件夹中,才能使一切变得更简单。

测试正确的行为:

  1. 在Internet Explorer上打开文件“teste.php”;
  2. 按一下浏览器上的刷新按钮;
  3. 查看名为“teste.txt”的文件,动态创建。
  4. 结果:文件中只有一行。内容表示验证码图像上显示正确的总和值。这是正确的行为,因为在验证码图像的显示上只调用了一次verify.php。

    现在,测试问题:

    1. 在Internet Explorer上打开文件“teste.php”;
    2. 按“开始!”窗体上的按钮有时候。 3x就足够了;
    3. 查看名为“teste.txt”的文件,动态创建。
    4. 结果:文件上有多行。可能2.其中一个人具有验证码图像总和的正确答案。这两个调用创建图像的方法正在弄乱验证码系统的正确答案,因此,没有办法将它与Internet Explorer一起使用。

      如何为IE解决这个问题?在Firefox中,一切都还可以!

      PS。:我正在尝试使用Lime Survey PHP脚本的验证码系统,但由于上述问题,它无法用于IE。

0 个答案:

没有答案