代码之家  ›  专栏  ›  技术社区  ›  arik

使用Ajax重新加载captcha

  •  3
  • arik  · 技术社区  · 14 年前

    这个问题可能已经被问过了——但不幸的是,我找不到任何令人满意的答案。我只要求它为我的具体情况,并要求管理员不要删除问题至少几天,以便我可以尝试它…

    我有一页。它使用验证码。像这样:

    <?php
    session_start(); // the captcha saves the md5 into the session
    ?>
    <img src="captcha.php" onclick="this.src = this.src" />
    

    这是我的第一个密码。它不能工作,因为浏览器认为如果源代码相同,重新加载图像是无用的。我目前的解决方案是传递一个get参数:

    onclick="this.src = 'captcha.php?randomNumber='+ranNum"
    

    javascript变量 var ranNum 每次随机生成 onclick 事件火灾。不过,如果两个数字连续两次相同(虽然不太可能),我还是不喜欢这种可能性。虽然随机数在-50000和50000之间,我还是不喜欢。我觉得这个方法不对。我想通过Ajax了解“righter”方法。我知道这是可能的。我希望你知道在这种情况下有什么可能,请给我看看。

    事先谢谢!

    顺便说一句-如果我用不同的方式拼写cap(t)cha,没关系,在我的代码中对php文件的引用是正确的:我使用randommage.php

    编辑:javascript中的随机数仅在图像重新加载时生成。captcha.php不关心$\u get参数。字符串确实是随机的。

    编辑:因此,我想知道的是,如何使浏览器在每次事件触发时都不传递不同的get参数而重新传递图像。

    4 回复  |  直到 8 年前
        1
  •  5
  •   Eric Mickelsen    14 年前

    不幸的是,Ajax不能提供动态加载图像的好方法。即使使用javascript的“预加载”技巧,浏览器也只需为每个URL加载一次图像。让浏览器从同一源加载另一个图像的唯一好方法是像现在这样使用不同的参数。而且,和其他答案一样,时间戳应该足够了。

        2
  •  3
  •   karim79    14 年前

    是否考虑改用时间戳?

    onclick="this.src='captcha.php?ts='+Math.round(new Date().getTime()/1000)"
    
        3
  •  1
  •   nico    14 年前

    只需使用:

    <img src="captcha.php" onclick='this.src = "captcha.php&time=" + new Date().getTime();' />

    您可以放弃时间参数并在PHP中生成随机数。:)

        4
  •  0
  •   dabicho    8 年前

    您还可以从一个Ajax请求base64编码中获取图像,并将其放入img标记中。

    当然,我认为这太过分了,base64编码的文件大约是原始文件大小的4/3。(3kb的图像在base64上大约是4kb)。

    编辑: 将img-src属性设置为

    数据:image/png;base64,base64encodedimage