您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14969|回复: 0
打印 上一主题 下一主题

[thinkphp学习资料] 验证码第一次异步校验成功,二次失败问题解决

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-30 17:12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先在Home/Controller下创建一个公共控制器PublicController

7 j( l5 L7 q4 \5 c
  1. <?php2 s! {; [3 z% e5 p# ^
  2. namespace Home\Controller;( q0 n- g* X/ k, \! Z  Z

  3. 4 [! j& }9 q5 ^3 H. {
  4. use Think\Controller;$ r0 l! a$ w8 r; y: I) W
  5. use Think\Verify;' b$ T/ }5 K. g% p7 K( j

  6. # q: y2 ]4 a, c$ Z' ^$ F. [
  7. class PublicController extends Controller
    4 A3 M& G, X5 g: p0 P
  8. {( `. x; F9 ~+ m; r% n6 z
  9. 2 ^5 _3 A6 ^8 w6 D2 V3 U, ~
  10. /* 生成验证码 */0 P: J$ F+ X# ^3 _" _
  11. public function verify()/ n$ `* Q* H+ R
  12. {
    & l, z' G2 E  e
  13. $config = [" e4 ^5 j+ S# y, a3 Q
  14. 'fontSize' => 19, // 验证码字体大小
    , D8 V% n/ R& p+ x
  15. 'length' => 4, // 验证码位数; O6 Y8 p5 L8 _/ N2 b0 H; N4 H- p
  16. 'imageH' => 34
    . f" t! v$ ^$ \) P0 h
  17. ];3 D5 B" z) [! u
  18. $Verify = new Verify($config);
    9 I1 L! f5 p* G3 P
  19. $Verify->entry();& k! }2 F2 p" G7 l* x( L. l
  20. }
    / t# W0 c# N+ ^( B/ K- s

  21. ) b* c$ _% U4 y" y6 ^$ |
  22. /* 验证码校验 */
    + r% O( B8 R' r1 q
  23. public function check_verify($code, $id = '')3 `7 B- D, C  n, g5 N, x
  24. {% }" F1 D1 R% p$ h. [
  25. $verify = new \Think\Verify();- N4 a: J; C: H, \- z; y. }
  26. $res = $verify->check($code, $id);
      j  c2 c+ \- }- g" u
  27. $this->ajaxReturn($res, 'json');. _/ ^. y  n6 @# z9 y
  28. }
    8 g+ R. ~# v8 `" E. [
  29. }
复制代码

6 y- z' a* z" Y! z" {6 v, B% Y! V/ _  C
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。4 n; I# |. D$ Q4 N* n$ K" @
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
. V/ E5 W- W, I) n2 C前台模板页建立index.html
2 n9 I& i* q) \& [$ x
  1. <div class=""># n0 p3 y+ z" T* H
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"% A# |6 {1 y7 G; g) \6 i" `
  3. name="j_verify" type="text" class="form-control x164 in">: K/ u9 q/ K* O% C7 c
  4. <img id="verify_img" alt="点击更换" title="点击更换") E. S! n0 o- P& Y5 b2 s1 B4 T
  5. src="{:U('public/verify',array())}" class="m">
    - U4 U* A0 s; ]7 H
  6. </div>
复制代码

4 y" m3 N5 j7 l" s8 s  j
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {" [; |, }8 H. V
  2. var verifyURL = "public/verify";8 W2 x2 d' E& a" A
  3. var time = new Date().getTime();  k/ w1 ]: D. @' O
  4. $("#verify_img").attr({
    # b5 |" a/ Q6 a
  5. "src" : verifyURL + "/" + time
    / G7 X  G, Z" A) O
  6. });
    ( X! N5 F" ?5 [8 W+ c  t
  7. });
复制代码
, n* a; ^, g+ Y* }' L& P
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

3 ?7 a$ Q. D+ G) v  A0 H5 P
  1. $("#j_verify").keyup(function() {
    8 H' [1 B8 _( I, |, q2 `7 t
  2. $.post("public/check_verify", {; b! k1 i6 f* Q+ G2 r0 B
  3. code : $("#j_verify").val()4 L6 U5 t9 k' L# x" O
  4. }, function(data) {
    6 P' x7 ~6 Z# F6 o$ J
  5. if (data == true) {
    + K( l' d1 d3 A6 ~
  6. //验证码输入正确% |0 e  M  @$ S' K8 ]3 Q: x
  7. } else {5 p, m  j8 p- D2 {- |) u& [" j' m
  8. //验证码输入错误0 @& H* o3 o0 l( H
  9. }2 f+ p3 t/ F+ i+ K
  10. });/ a2 @+ R$ o4 ]2 E
  11. });
复制代码
" d8 Q7 `. H# B( F- w
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    ' H; v; ?& B: o" o
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥+ V) M( M3 O) A# V: [( \
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合* e2 `! x/ K$ O/ f* Z6 S% K: F( s( l
  4.         'expire'    =>  1800,            // 验证码过期时间(s)
    2 _2 c# d0 Y( g; \! h
  5.         'useZh'     =>  false,           // 使用中文验证码 7 x5 n, ^1 c. q3 x3 W; o
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串2 _, E# t: }  N, |4 V: ^
  7.         'useImgBg'  =>  false,           // 使用背景图片
    5 O; u: C0 q9 Q& Q
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)$ \) L4 C5 u; Y* A  `6 }3 i) C$ F
  9.         'useCurve'  =>  false,            // 是否画混淆曲线
    , X8 y/ c, M" S2 l. |: [% I
  10.         'useNoise'  =>  false,            // 是否添加杂点   
    % n' E+ h" Q" c3 b- Z
  11.         'imageH'    =>  0,               // 验证码图片高度
    2 ~  u2 R" n1 A$ J2 R9 H. A
  12.         'imageW'    =>  0,               // 验证码图片宽度& Z0 p- {  A! z/ p, ~5 A. |4 Y
  13.         'length'    =>  5,               // 验证码位数
    # z; f1 h, ]( U5 E4 Y; Y6 {
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取
    / L( y4 L) ~. T* t
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色' e  W! Z4 h: a; b+ L  f
  16.         'reset'     =>  true,           // 验证成功后是否重置
    " y7 r6 W+ N( Y- L' {. U9 I
  17.         );
复制代码

1 j  I8 Z" g/ f* n. G
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
3 c! X. c( D' V$ r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-22 10:04 , Processed in 0.056611 second(s), 19 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!