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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

5 b$ Y' C3 E3 t2 X( n& E0 @% `! l
  1. <?php6 q& k1 u' Y8 o* w( t* o
  2. namespace Home\Controller;
    % \7 g1 f7 S  C0 o6 z, B; n7 j: ~

  3. # s# W) m8 K% @9 p7 F: V) H$ Z/ I. k( z+ e
  4. use Think\Controller;
    7 L& F1 f  b- Z, X1 v! y/ {4 k
  5. use Think\Verify;0 {4 P+ T5 ]# x# B+ O% f' J

  6. 8 X5 }$ t# q* d0 `1 C
  7. class PublicController extends Controller
    ' u) G. S" V0 {
  8. {
    0 E5 Q2 N' Y2 U

  9. # ]. R6 E" f( d4 {% w3 G! r- C. k
  10. /* 生成验证码 */6 c9 h/ {6 b, Z& h5 N6 O
  11. public function verify()- W3 w% g: z5 U3 ]. }; I1 @
  12. {
    5 X' N3 a6 @4 o! J
  13. $config = [
    8 o) u9 r1 I7 S/ b5 {' i2 N
  14. 'fontSize' => 19, // 验证码字体大小
    % U7 w1 U% N3 h% V8 E0 w
  15. 'length' => 4, // 验证码位数! g5 ~' C6 c% g4 Z5 O2 C+ w
  16. 'imageH' => 34
    0 [5 R: I" R9 C2 Q
  17. ];. r) z5 o: _3 d5 G
  18. $Verify = new Verify($config);
    6 b( H  u% I) S7 ~* O, S" @
  19. $Verify->entry();
    9 ~  L; \, j* Z1 b
  20. }+ T) r8 v$ t8 b3 d! C

  21. 3 X* Y8 K# M2 Q/ ~8 @$ E
  22. /* 验证码校验 */
    , N7 c" ?0 Y1 a( F) k
  23. public function check_verify($code, $id = '')# u* j+ A3 j  ^/ l" o  J
  24. {# `; A7 ?$ r- M7 ]1 X& ]# W+ L
  25. $verify = new \Think\Verify();4 V/ c9 o. W& _( p) {. v1 f
  26. $res = $verify->check($code, $id);7 M7 i0 }4 \8 Q8 ]5 n7 b0 m1 g9 @
  27. $this->ajaxReturn($res, 'json');1 i# E' K) K& `9 q
  28. }
    ; U; p4 V+ {4 I  N
  29. }
复制代码
0 O1 q/ x" ]6 [+ ]# ]; G$ J) G

8 N7 V2 g( ?) tverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
( M1 w3 U. q/ K4 Zcheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。" T* Q& x4 c, E3 y% v9 `6 f- s& {
前台模板页建立index.html" ?  R+ ~2 r1 f
  1. <div class="">7 S! K3 l( S: ]' q  S. O1 P  A! N
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"8 D% K4 L9 E. e# N& F4 {: L' U8 x/ Q
  3. name="j_verify" type="text" class="form-control x164 in">. p& O8 m+ G( ?
  4. <img id="verify_img" alt="点击更换" title="点击更换"& Q3 K! m9 V) ^  [& [
  5. src="{:U('public/verify',array())}" class="m">8 `) L: U; \6 }9 e) _
  6. </div>
复制代码
& _* l9 h8 D8 ]" H. F. [+ `7 R$ c! v  e
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    ! @0 F  u% W0 C  V+ k" t$ q5 h' h
  2. var verifyURL = "public/verify";
    9 R* V: K# [- E; a
  3. var time = new Date().getTime();
    0 y: V4 E. s5 S; i2 X3 |; V+ u
  4. $("#verify_img").attr({2 e7 W6 a+ k% l; T' J1 i- U
  5. "src" : verifyURL + "/" + time
    $ `3 A6 _$ Q$ V  h
  6. });. M2 N6 f; U0 A9 D* M1 N% W3 s
  7. });
复制代码
$ K, X! Z$ v$ D* W; M2 Z7 ~4 n
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

" E, c" ?* c5 x+ v2 F
  1. $("#j_verify").keyup(function() {
    , r" \' ]- Y+ j2 ]3 v7 @, ]
  2. $.post("public/check_verify", {# c7 y8 Y# n+ ?- W4 C
  3. code : $("#j_verify").val(), L! R# R6 Y9 x- l! o% b- P, F
  4. }, function(data) {! C0 A8 V- k& U$ t7 n
  5. if (data == true) {
    * S7 I* j/ M/ }& C
  6. //验证码输入正确
    $ ?% Y# J/ X0 Z9 g& \* Q) e' W% g
  7. } else {* }8 b6 T! c& a1 O: a5 K) Y
  8. //验证码输入错误# i7 k1 ~" N& c( u0 O. e
  9. }
    6 ?1 h: r4 J' z1 w- ^
  10. });
    + B% T! o, _5 }1 J0 l2 S4 Z
  11. });
复制代码
- z2 ]& H1 h* P0 W5 ~
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    4 a, ^2 A3 V' x5 B2 K
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
    9 F3 e% @% Q) T7 a* w9 E  g. ]
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合
    & {5 J/ N( l0 r/ ?0 D! z
  4.         'expire'    =>  1800,            // 验证码过期时间(s)
    ! r1 U% G8 e3 ^& o7 a% _8 d0 U% [
  5.         'useZh'     =>  false,           // 使用中文验证码
    3 |$ [; H+ Y* t. U% J# r
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串
    # v+ C) x% g7 k7 e& y" H1 }9 p2 a
  7.         'useImgBg'  =>  false,           // 使用背景图片
    + f: B* r7 m8 I0 M+ {: g
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)
    + k6 p( o& k; U- {
  9.         'useCurve'  =>  false,            // 是否画混淆曲线
    1 t6 B! h8 j: L  ^
  10.         'useNoise'  =>  false,            // 是否添加杂点    4 `, Z0 H2 }4 O* y
  11.         'imageH'    =>  0,               // 验证码图片高度
    2 x9 Z8 F0 v( m6 }6 }7 ]
  12.         'imageW'    =>  0,               // 验证码图片宽度$ ^9 N4 J5 c! K
  13.         'length'    =>  5,               // 验证码位数
    / H  F  O* |: L" Z) o8 o1 I
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取! Y- n$ w! d, N! e
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色
    - C2 k9 k1 W, U+ {5 B, W& ?3 n* X
  16.         'reset'     =>  true,           // 验证成功后是否重置2 H: g' B. _4 o& d# u$ N
  17.         );
复制代码

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

本版积分规则

GMT+8, 2026-8-4 11:46 , Processed in 0.058168 second(s), 20 queries .

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