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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

5 \3 S: j% j5 r* y6 L
  1. <?php
    , |: G1 N; M6 |9 h, f( d4 G
  2. namespace Home\Controller;
    ; U6 o/ F6 e* ~
  3. 8 [( t, d5 q* r, @
  4. use Think\Controller;. X; ]" r0 }  G. [% p. Q" I
  5. use Think\Verify;
    + |' }. h, \% \; \
  6. 3 `* ]$ C6 d+ }5 V! d8 J, ]
  7. class PublicController extends Controller+ _; n$ }0 `* _8 R
  8. {. v/ k& ?5 F, t8 I1 W" b3 w

  9. 4 T& f  H, _9 k
  10. /* 生成验证码 */, B# K& G( h, X& P
  11. public function verify(): Y" k" ?! q/ r9 D; v* L+ H+ H
  12. {* r0 h2 O% o: x9 i3 x- t) S; [
  13. $config = [6 k. ?! G* C; k% ~6 r
  14. 'fontSize' => 19, // 验证码字体大小
    9 q) H* E$ R7 ?9 S
  15. 'length' => 4, // 验证码位数
    . J  B$ _/ S" L  Q: Y7 c. i+ O, O5 X
  16. 'imageH' => 34
    + q# q# f, Q0 c. W
  17. ];* i* e4 L/ I# w; w5 S
  18. $Verify = new Verify($config);
    ) G0 U5 f: X; k
  19. $Verify->entry();9 \& W/ n* Q* M1 ]$ F- r/ ?
  20. }
    ' a0 a( _" w+ V5 ^, C

  21. ! d' e0 f* H0 D5 P. q
  22. /* 验证码校验 */8 q: I- ~7 v4 V# z7 m  v
  23. public function check_verify($code, $id = '')
    9 S2 n  g+ b! U) n0 P5 U( x
  24. {
    . U3 n$ Z0 b* ]4 v- `2 `
  25. $verify = new \Think\Verify();
    # q1 O& T1 i2 o" c  W; ~
  26. $res = $verify->check($code, $id);6 L# P* ?! {9 }: T5 j" `
  27. $this->ajaxReturn($res, 'json');. o& F. t! X. U3 t+ o
  28. }
    * d) L" m' {: D4 D5 R9 G# \5 M
  29. }
复制代码
, R: X- b, Q) ^1 n& U
2 }, ^; D0 ]8 v" D
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
3 S* N) F" N" }" ^6 Dcheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
& f- M! @! w4 x, [0 A前台模板页建立index.html
/ x0 W' i6 @5 @. X) y0 D, D" u3 w+ l
  1. <div class=""># R& N, w0 D- j+ g5 X
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
    " o4 O) o; k2 {! Y" s% a7 e
  3. name="j_verify" type="text" class="form-control x164 in"># l; b' g$ Q- M  O
  4. <img id="verify_img" alt="点击更换" title="点击更换"
    8 ^, h2 b( I( e' M3 t
  5. src="{:U('public/verify',array())}" class="m">. g+ p4 d7 n* U3 S& I, x( \
  6. </div>
复制代码
% ~1 y/ a8 `' n6 V) z
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    6 P0 {8 P$ [9 ~$ Y7 v
  2. var verifyURL = "public/verify";
    , s1 g0 a4 G$ p
  3. var time = new Date().getTime();
    ' d  J. V& l* u1 y
  4. $("#verify_img").attr({3 `, B8 \0 t8 U' _, N
  5. "src" : verifyURL + "/" + time
    2 ~" U$ p% Z0 f: s
  6. });
    ( H2 O  K& m% }9 q8 X& }, l
  7. });
复制代码
- w7 U7 W& p$ u; j
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

% i9 p3 B4 k* g5 @: t
  1. $("#j_verify").keyup(function() {
    $ ?  I0 Q" R( U4 ~0 v
  2. $.post("public/check_verify", {
    1 |& t' K$ \3 \
  3. code : $("#j_verify").val()0 o. a+ L5 s& }7 i. Y/ z6 I
  4. }, function(data) {! V+ Z- h6 ], [
  5. if (data == true) {; a3 z( S0 m7 T: W. [
  6. //验证码输入正确
    0 u2 Q* H8 O- c$ D. d& X
  7. } else {7 H# ?2 D6 X0 o1 _/ ]
  8. //验证码输入错误, N, D9 N2 U3 k/ d* h# ^, u
  9. }5 J0 B! f3 v0 y2 c
  10. });9 B5 n1 |( N* v3 [3 l& A0 |* K$ R
  11. });
复制代码

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

本版积分规则

GMT+8, 2024-9-29 07:27 , Processed in 0.111244 second(s), 22 queries .

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