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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-30 17:12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先在Home/Controller下创建一个公共控制器PublicController
5 P' Y; y6 @8 K: j. v
  1. <?php
    5 [1 W9 W! U) X
  2. namespace Home\Controller;
    0 d1 ]9 F1 B! d: z! H
  3. , a* i: N$ F7 }9 E/ P
  4. use Think\Controller;8 c  J" b8 \; _7 A8 n$ c$ `0 t
  5. use Think\Verify;
    7 x6 t) w- N0 K4 B! O' W7 D4 [% @, A

  6. 2 o/ ?; w) H8 }
  7. class PublicController extends Controller
    ) R( Y! X& }1 i
  8. {
    - d( I, Z( a- T) L9 w8 R0 Q5 c6 f

  9. ; B. ]1 L* o, z" C
  10. /* 生成验证码 */
    " W  }5 Y% |3 x2 p9 ~, b* K& F# Q9 ]
  11. public function verify()
    ; p- ^3 ?) C7 S5 p& u' [; V6 U
  12. {
    & Z  U; X8 |0 k( s  k6 Z
  13. $config = [! I  E# P1 \4 F6 e, c
  14. 'fontSize' => 19, // 验证码字体大小8 W. j* N8 h% f& T( ~
  15. 'length' => 4, // 验证码位数( X. T5 K. E9 q+ h1 B6 |6 m
  16. 'imageH' => 34
    5 R- r7 d; z- s
  17. ];
    " h6 b! ^7 B) [8 _9 c! a3 O
  18. $Verify = new Verify($config);
    # i& m4 h# ]6 Z, n. `# o% q
  19. $Verify->entry();7 c9 x7 a7 a7 Q& K6 o0 ]
  20. }
    ( _% h  ~8 |% k) R

  21. ; ?+ P: H$ T/ U9 x$ @
  22. /* 验证码校验 */
    8 n( t. d; R# x: F1 x  n" S
  23. public function check_verify($code, $id = '')
    4 g9 L/ T4 U8 m8 E: x) _3 v
  24. {
    2 D$ q: R7 h0 w9 i
  25. $verify = new \Think\Verify();
      H7 y) d9 f- a
  26. $res = $verify->check($code, $id);
    + |. t9 C3 e* D- |, N
  27. $this->ajaxReturn($res, 'json');
    * Z: b6 H! v( \8 a( v
  28. }
    ' h1 ?5 m$ F: K; E
  29. }
复制代码

  @# j- S9 L2 y5 g  ?! C$ L* A# e0 v! r6 Y4 q* t' k
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
+ J9 F. m. ]& P# Y9 K  ycheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。/ A8 ^1 G/ F' J% }% N- C1 g
前台模板页建立index.html
& l% H! V- T" g1 z; I  D
  1. <div class="">
    0 O5 m  B; p& P
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"" f  X8 A. A. R5 J# j
  3. name="j_verify" type="text" class="form-control x164 in">: b! W% h3 e* W# H6 Q
  4. <img id="verify_img" alt="点击更换" title="点击更换"
    & ]0 c) Y2 @3 E; G
  5. src="{:U('public/verify',array())}" class="m">
    5 U5 P9 |* F( I9 m
  6. </div>
复制代码

2 _) V& w8 n( f9 _
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    % ?& c  I# p: `8 E) t1 n
  2. var verifyURL = "public/verify";
    & n3 j! v/ Q* r& y% Z3 \
  3. var time = new Date().getTime();
    ( M, D# h0 E  n8 b8 V
  4. $("#verify_img").attr({
    5 v4 w# k1 o8 j1 I& r  Q
  5. "src" : verifyURL + "/" + time
    4 r5 i) e. l9 `: s8 ]
  6. });
      P' u  K7 j' s# J  q7 l. _& @
  7. });
复制代码

0 O& B6 B! w# P: `" G, R
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

: e' v* J; w) Z  x
  1. $("#j_verify").keyup(function() {
    4 ?. B) n) G6 C; h
  2. $.post("public/check_verify", {" d) [3 c- C$ Y, q  b
  3. code : $("#j_verify").val()
    % R2 V' ?: {' A* N% A! z
  4. }, function(data) {
    # K* p* [' J# |! R& h
  5. if (data == true) {
    $ S. k; O; V% d6 I3 O& c
  6. //验证码输入正确
    + ^' d4 R. A" B* t6 r7 p. V  X5 ?
  7. } else {4 y, _, _5 d2 ]* @6 |; Q
  8. //验证码输入错误0 i; N; C8 x5 k; Y9 ~7 n: B5 U
  9. }
    ) ]# A" w( E* R' w
  10. });
    " _, F9 u# E: I1 W0 r
  11. });
复制代码

. [$ Q6 r: U# D* }
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(1 m. f% M; \5 Q* h, d, K  Z9 I
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
    1 d, W! |/ ~4 _( P# M# F
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合# F4 ]+ S6 t( H* f
  4.         'expire'    =>  1800,            // 验证码过期时间(s)
    2 }" G& j: }3 i
  5.         'useZh'     =>  false,           // 使用中文验证码 * I' m$ C( L3 r3 {- i
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串
    0 z4 {4 N6 E: K$ s
  7.         'useImgBg'  =>  false,           // 使用背景图片 " P7 a  }7 k6 l: ~+ }3 R" U
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)
    ; \% Y  U# Z8 }6 I4 C# V: z
  9.         'useCurve'  =>  false,            // 是否画混淆曲线
    ! @2 V/ _% G5 J" \" W2 r2 }
  10.         'useNoise'  =>  false,            // 是否添加杂点    0 a' ~) W4 o: C, g* K/ F
  11.         'imageH'    =>  0,               // 验证码图片高度
    ! G7 u* y5 S6 }. s
  12.         'imageW'    =>  0,               // 验证码图片宽度2 i9 q9 h7 z8 d* E2 P9 H; C
  13.         'length'    =>  5,               // 验证码位数) w# g! n$ ^, |! b2 a9 e$ O
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取$ a( Q1 R( R$ T% d
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色- q" m# O4 c; m0 H
  16.         'reset'     =>  true,           // 验证成功后是否重置
    4 @! Y2 g* X3 O) A0 v( T; m, ]
  17.         );
复制代码

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

本版积分规则

GMT+8, 2024-5-20 08:26 , Processed in 0.113743 second(s), 21 queries .

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