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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

6 @, e  P6 l4 M( [! B5 M
  1. <?php. p* _+ Q1 G7 S2 P1 R2 d
  2. namespace Home\Controller;
    2 y# Z* O* c+ N, M4 X, T; j

  3.   T" D# Y9 `2 N. w# t) G& p! Z$ ?9 Y
  4. use Think\Controller;
    1 U3 d$ f% K2 w! f1 F
  5. use Think\Verify;
    " a4 R& x" Z4 P. B: T
  6. ( b1 S6 o4 l& r3 h! {" x: Y
  7. class PublicController extends Controller# ]3 W- ~: I8 N! @. e" g- H6 ]6 U3 o
  8. {! P5 }, J- s3 G

  9. 4 m& F) t2 k# D! {. D5 |
  10. /* 生成验证码 */
    " d) h& R! u: O- V& g; ~, U, Z
  11. public function verify()3 z! U7 x& ^5 d
  12. {" ~" U  e+ l$ Y* U6 G3 b  M
  13. $config = [
    ; k8 {/ d( @$ r' m) P
  14. 'fontSize' => 19, // 验证码字体大小
    # e8 f$ t2 I, P3 \+ d# _- N: h
  15. 'length' => 4, // 验证码位数) `1 r" Q! O% @) E' ]8 j6 P
  16. 'imageH' => 346 @3 M) h; x* R. [$ a6 V  j
  17. ];
    ) k# {8 d, J' d# h
  18. $Verify = new Verify($config);; j1 m; Y2 b! o' Q
  19. $Verify->entry();
    , |2 {, W3 W) n
  20. }( Z7 e4 c* C  {# C0 O! j
  21. 8 T: L9 {* B' v* ?0 z; ], Y: M
  22. /* 验证码校验 */4 `9 D: S: C. P0 y% G$ w8 O, y
  23. public function check_verify($code, $id = '')
    - B" |7 v. a5 \' Q( z
  24. {
    7 l* P7 u7 }' S* v  e  D* D
  25. $verify = new \Think\Verify();
    ( p! p( d) c" r$ E  q: C; o5 h
  26. $res = $verify->check($code, $id);7 i/ s& ~  l' Y' i
  27. $this->ajaxReturn($res, 'json');
    ( _% a/ |3 O- e% K2 k
  28. }! K4 t6 r" C: t
  29. }
复制代码
& e2 j( k  O0 S% |1 i/ u

3 T: k1 [( ?# ]! u3 W& Y# dverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。5 q) u* N' T1 h# i
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。7 Y" b; K7 J9 N8 P8 a
前台模板页建立index.html
  p$ V; _2 [" R' g
  1. <div class="">
    8 X" ], ~0 g" H, w* {% D
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"' N& p: g$ i) G- k) a- u/ H
  3. name="j_verify" type="text" class="form-control x164 in">1 O& ?. F2 Y. `# r$ C. Z) }
  4. <img id="verify_img" alt="点击更换" title="点击更换"
    / w2 C5 o# F" p" N+ C/ d+ o7 @
  5. src="{:U('public/verify',array())}" class="m">$ D) N0 A# e  K' n; n
  6. </div>
复制代码

6 T* V9 d6 h) t9 a$ I$ e
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    " g; f* j8 w4 }
  2. var verifyURL = "public/verify";
    , P$ F9 B. ]& ]( c! i
  3. var time = new Date().getTime();5 E4 Y8 b3 J+ j) s: ?) ~( }
  4. $("#verify_img").attr({
    1 r/ O+ t3 @  `) t
  5. "src" : verifyURL + "/" + time! L: @# |9 `$ [1 ]
  6. });; h# N& G5 b3 U4 i/ |4 Z5 b  s
  7. });
复制代码

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

- D0 |2 a/ n  {: R8 N: E, B% K
  1. $("#j_verify").keyup(function() {
    $ ^, ?; w, m$ K9 h- R
  2. $.post("public/check_verify", {# x* b4 B3 j5 Q4 Q9 L5 ~
  3. code : $("#j_verify").val()5 }# F1 T; K& ^; \6 ^7 P
  4. }, function(data) {
    % ?4 H% ^) a0 H; o. a
  5. if (data == true) {, t' W# U/ o# T( }: L6 N/ n
  6. //验证码输入正确: T! h8 B  K& ^! G+ o
  7. } else {- [" N0 x5 H9 r4 [
  8. //验证码输入错误
    + d4 n8 R+ z- b# C$ r& _2 R1 P) u
  9. }* f* Z# x0 E4 T) r6 P7 c8 Y
  10. });7 ^  o# k8 R, S7 H' r
  11. });
复制代码

& J# v0 Q* D) c7 h
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    4 W- l4 C: _; J# U0 ?7 {5 i
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
    ) ^4 _  Z% e2 D/ }9 W; D' C
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合% b% C- E' Y& N6 E3 I# Y8 U2 j+ }! v
  4.         'expire'    =>  1800,            // 验证码过期时间(s). S3 Q# G' h% S! V0 Z8 C- b  T
  5.         'useZh'     =>  false,           // 使用中文验证码
    4 q# g: e, C! ]+ G: h, N
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串8 _1 F( k0 l& j. y
  7.         'useImgBg'  =>  false,           // 使用背景图片
    7 m: b, x6 W9 `& w" x! Z& A
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)
    , b8 A" T1 k8 g. t" q6 {- h
  9.         'useCurve'  =>  false,            // 是否画混淆曲线' [& c$ \( T* Y' ?% k4 ?7 S8 P& d4 X
  10.         'useNoise'  =>  false,            // 是否添加杂点    , K0 y8 }5 D" c
  11.         'imageH'    =>  0,               // 验证码图片高度
    1 ]1 S" i+ ^. k
  12.         'imageW'    =>  0,               // 验证码图片宽度5 |# O, [, ]' T. C3 s! }
  13.         'length'    =>  5,               // 验证码位数6 e" B( n, g& T2 }9 f+ T- F
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取. m: o4 j2 @, p7 p. s
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色
    8 @* \7 X8 ~( e4 U$ }
  16.         'reset'     =>  true,           // 验证成功后是否重置
    / m) U! @) z: P1 x1 F
  17.         );
复制代码
4 T0 S  c$ N* S- G5 r  [: b
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
7 a; a2 m& W2 k, B: G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-4 12:59 , Processed in 0.061122 second(s), 19 queries .

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