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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-30 17:12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先在Home/Controller下创建一个公共控制器PublicController
4 d6 A  @+ `% H
  1. <?php3 [6 G$ a& m0 a# g" M
  2. namespace Home\Controller;6 @" r2 }0 k% P
  3. * O' w3 D  ]9 ~% B2 K) B
  4. use Think\Controller;
    3 u# c" m2 \; N2 o5 a' p9 Y
  5. use Think\Verify;
    : A( z% E. S+ k* V4 d; J3 T8 W% X
  6. 2 @% P) C. F7 _& s* T9 t7 n# K& \, Y
  7. class PublicController extends Controller
    * b" R7 _& o8 n# Z
  8. {
    ! E& O, `4 k4 t/ V! x1 b9 e" j
  9. + M; y. J0 R; ?1 o( Z
  10. /* 生成验证码 */
    + \& T5 l8 K; }  @+ }
  11. public function verify()9 w9 P/ O$ d' K! S) K& L/ U
  12. {
    . `+ j3 v- H+ V' Z7 R! Y
  13. $config = [
    / \. B: W. n& G( q
  14. 'fontSize' => 19, // 验证码字体大小
    & c8 o! f: m# e9 p  Y
  15. 'length' => 4, // 验证码位数
    " l% T! F3 R" ~) K0 |& D  l9 |8 W
  16. 'imageH' => 34' i1 b1 M$ _7 U7 `! W4 v" Q
  17. ];  _& L7 I) w. y9 b7 Q
  18. $Verify = new Verify($config);1 Q  i+ h$ N5 x' u, E2 r
  19. $Verify->entry();# D8 t$ r, t9 ]* |, U
  20. }8 _. m% \! C( B  ^
  21. # K" a0 L6 c# T  P& A
  22. /* 验证码校验 */
    . i5 A( c( ~* \: X2 d
  23. public function check_verify($code, $id = '')
    2 q9 i" ^5 l. x6 M0 S& a; A
  24. {4 e& W$ ?1 h+ s. Y8 ~
  25. $verify = new \Think\Verify();/ Z' Q4 {% B" f, d: N9 e. I3 u' g+ i
  26. $res = $verify->check($code, $id);& c( S/ B( T$ ^# S1 j: m# ^; h: T$ X
  27. $this->ajaxReturn($res, 'json');, f; [7 E7 l+ d' `7 J8 e5 r! z
  28. }5 D0 ]7 J1 s7 X+ S4 N1 D, v
  29. }
复制代码
$ ^; t7 f) c6 V; Z; k, a9 y  }' q( n' X

. B, d4 e  [8 h1 ]2 l( e& \/ J: [verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
- _: ~) C( K! {+ N4 `" v8 x9 g; fcheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。( c9 s- s: m. f7 R
前台模板页建立index.html
5 X: k9 u1 n, j! \- H7 Q
  1. <div class="">
    1 ]( t2 A0 `8 ?
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"+ \. E8 ^! J+ C% _
  3. name="j_verify" type="text" class="form-control x164 in">2 u" U+ c" U6 G) O
  4. <img id="verify_img" alt="点击更换" title="点击更换"
    5 T  W+ B. W( L2 p
  5. src="{:U('public/verify',array())}" class="m">
    ) j* c: r& e( Z
  6. </div>
复制代码

1 V  y% a3 ^( a% M! l- x* `
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {& D( |3 B% N- w1 R$ q& W4 N# q
  2. var verifyURL = "public/verify";
    ( _! Y4 J- U/ {+ b
  3. var time = new Date().getTime();/ t' P9 W0 L' R8 B* X# Q
  4. $("#verify_img").attr({0 L8 t( ]8 |: u9 M% ^6 U
  5. "src" : verifyURL + "/" + time' _7 T7 b5 Q) ~7 D9 l
  6. });
    5 T$ P, F% T9 R( x, x
  7. });
复制代码

. S/ X0 r& V6 W3 B6 S
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
1 i* X7 A+ o1 }8 I5 l
  1. $("#j_verify").keyup(function() {
      R+ p8 V% }  z  S2 w5 ?
  2. $.post("public/check_verify", {
    ; u$ R5 r0 d$ R1 b
  3. code : $("#j_verify").val()( t6 J, X, a, H& N6 o( C* [2 ~
  4. }, function(data) {
    + A& P9 ]9 R8 m
  5. if (data == true) {
    $ i/ C8 F* D0 Z5 r# U
  6. //验证码输入正确' m- @6 r9 S! K/ M1 a' I6 [
  7. } else {
    : I( f- G# ~, Z6 k5 r9 t; W( k
  8. //验证码输入错误
    . c5 p' y$ e4 S
  9. }" f4 \8 P; C2 T7 E
  10. });
    * A8 u" g, ~8 T! {, }
  11. });
复制代码
* W) p4 E6 E. ~8 W0 H% M( d
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    + \. h1 W! i" x, ?5 Y
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
    8 R6 d6 u6 R! `1 h; F/ }$ z* j
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合
    5 T0 f  L! G9 s
  4.         'expire'    =>  1800,            // 验证码过期时间(s)  c8 Q* |* m) r9 b( t, J
  5.         'useZh'     =>  false,           // 使用中文验证码 ) x, s8 N5 g/ Y
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串
    6 \& ]( }: @4 ~4 G3 j3 j
  7.         'useImgBg'  =>  false,           // 使用背景图片 7 x" [, c  E) p4 ]1 ~* k" O
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)8 ]* t: ~- F& T, ^8 ^
  9.         'useCurve'  =>  false,            // 是否画混淆曲线
    . `/ N, z* }8 U9 S
  10.         'useNoise'  =>  false,            // 是否添加杂点   
    4 o" K# o! H; U
  11.         'imageH'    =>  0,               // 验证码图片高度9 \, l- ?  b) a: m- j* z7 O
  12.         'imageW'    =>  0,               // 验证码图片宽度$ @0 j: p; J0 O/ H. `) a4 I
  13.         'length'    =>  5,               // 验证码位数9 C: x9 r1 ]9 I' s2 Z
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取
    ) N4 |7 d6 M! b) N( @& Z+ U( c
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色
    8 N0 W. l& Y6 _4 X# L( F
  16.         'reset'     =>  true,           // 验证成功后是否重置5 \  V# k- [; f1 r5 E
  17.         );
复制代码
% _: c" y: a) s8 [2 u2 B
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
5 G3 h" ?7 g1 f/ W' x9 h- d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 13:33 , Processed in 0.051823 second(s), 19 queries .

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