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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

# s/ L* ?8 u" }% t' D! X! i; a8 ~
  1. <?php7 X4 a. C+ m3 b+ j+ `2 O
  2. namespace Home\Controller;
    9 T( N+ O) S7 S

  3. 7 {3 N0 P( N1 e% o0 H8 U  w
  4. use Think\Controller;
    - T$ A. a# a/ I$ n
  5. use Think\Verify;3 V- _; x# F' ~
  6. 2 ]( O+ W, {8 Y0 l# ^
  7. class PublicController extends Controller
    9 y1 t6 S2 ^8 k# k: c4 Y" |5 G
  8. {9 p6 Q/ v/ C8 r1 w* y6 l
  9. " w- S& k+ s' e2 q3 n, j
  10. /* 生成验证码 */
    ' H7 [9 m  r' D  t; d/ n2 K
  11. public function verify()# C# F( a9 c. b/ m+ E: U
  12. {
    # G& A) t) S/ B) f0 H6 v# _& r, r
  13. $config = [
    # W8 l* i1 U8 @, b$ E* y" N
  14. 'fontSize' => 19, // 验证码字体大小/ j$ C; Z8 V- v
  15. 'length' => 4, // 验证码位数
    2 ?: z. C$ N' Z0 P" _# {% t( z
  16. 'imageH' => 345 Z) Y. C+ V" l2 Q9 v
  17. ];8 e  V- J: c. H. N. P
  18. $Verify = new Verify($config);. v: Z8 p) i6 f- M1 {1 u
  19. $Verify->entry();
    & f1 c9 U8 B2 S( A1 g* K
  20. }
      _5 N. g; O* v& [( j

  21. $ U, s+ V# c# @, v: M, L0 i. m' Y
  22. /* 验证码校验 */, y2 Q) G) e3 l4 w
  23. public function check_verify($code, $id = '')
    ( c( H) ]5 g! M3 Z" i- [
  24. {) p3 {; |# J- H( [7 \8 _0 _
  25. $verify = new \Think\Verify();( `# W* i3 u/ `0 v/ l9 \3 z) e  e
  26. $res = $verify->check($code, $id);# M3 G) J/ \6 o# k, M
  27. $this->ajaxReturn($res, 'json');3 k, R( `/ M/ b; o8 Y
  28. }
    . i# K; ]2 d0 }: u  ^
  29. }
复制代码
- U2 x- i- i& K& @1 O

5 X  z2 d# ^/ D, p6 H9 d$ d- R, G$ tverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。  n) G; C+ Z, I/ F  F/ Q
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
+ ]4 e9 t2 A( F, V9 ]前台模板页建立index.html! r5 R) k, I0 ~/ l: @, @
  1. <div class="">
      s& i# H. l3 B% ]* t" N
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
    0 [9 Z) T) X. p' Q) z0 ^
  3. name="j_verify" type="text" class="form-control x164 in">5 ]: \( S+ V. G3 Y
  4. <img id="verify_img" alt="点击更换" title="点击更换", P0 [% I) K7 i9 d
  5. src="{:U('public/verify',array())}" class="m">
    9 _8 o, A  T7 l( p* z5 X6 {* W
  6. </div>
复制代码
2 a3 f3 A9 o6 g- z
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    2 H1 F: h" R) D! B
  2. var verifyURL = "public/verify";& A/ d( M# S8 U/ V1 [5 `8 j
  3. var time = new Date().getTime();0 o% P' d8 |& w* Z9 V
  4. $("#verify_img").attr({7 u6 R$ S( a" l) T
  5. "src" : verifyURL + "/" + time
      X% T9 @9 N$ _) Y8 @2 r6 Y. n
  6. });
    7 Z) a1 A6 `* q
  7. });
复制代码
7 I4 j: i) }! e5 K! ]
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
6 k# H1 \- U+ @6 p0 ^  b" O
  1. $("#j_verify").keyup(function() {: J. q; V& @: S
  2. $.post("public/check_verify", {
    3 E7 j( x7 `) B7 b/ A
  3. code : $("#j_verify").val()
    - b, R: V  `$ d( _0 p
  4. }, function(data) {" U7 w6 W5 A5 c! _
  5. if (data == true) {: W- `* d, W- x* y2 A- u( d6 c6 T
  6. //验证码输入正确; Z+ _1 B. e8 d. V- D9 R- }
  7. } else {
    6 b4 S2 C* S* }
  8. //验证码输入错误
    9 X& Y. b5 f- k# _; X
  9. }# V3 l# s1 k+ H. V& f5 L
  10. });1 J5 w3 J6 h7 o& L' w
  11. });
复制代码

  I6 `4 Q; `' g+ z6 j6 T1 U. Y
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    5 J5 G' T+ X" ?, T% t
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥7 v6 ?6 ^4 L% j5 X, D
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合1 D- g+ L9 {% U  D
  4.         'expire'    =>  1800,            // 验证码过期时间(s)4 `: G7 d+ z9 K6 X+ `" ?6 ?9 W2 G
  5.         'useZh'     =>  false,           // 使用中文验证码
    , I; a7 _6 ]% s' J; Y1 x
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串
    # n8 P- X6 }7 \! I' ?, d+ g
  7.         'useImgBg'  =>  false,           // 使用背景图片
    9 ^7 r1 j% N' R9 ?9 i
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)
    4 }" f+ b4 J" n: O1 L! y( K
  9.         'useCurve'  =>  false,            // 是否画混淆曲线
    0 Y' S) Y7 k) f! D
  10.         'useNoise'  =>  false,            // 是否添加杂点    ) S& f3 j# j0 ~+ {" A
  11.         'imageH'    =>  0,               // 验证码图片高度
    , M0 A2 ~- N+ L+ h5 _2 f* [  X) }
  12.         'imageW'    =>  0,               // 验证码图片宽度
    7 q5 j$ G0 u7 f2 K
  13.         'length'    =>  5,               // 验证码位数
    9 [  J1 u1 j& L: D7 E: E
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取
    ) X" I2 s) |  E" D  \
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色: k  {* n" c! P- b, f  ^6 t: b
  16.         'reset'     =>  true,           // 验证成功后是否重置
    / i( M/ c3 o- n/ R/ t5 Y
  17.         );
复制代码

, f! G- D# P7 v* t, W: c! z
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。

/ K4 f! n* ^+ Z6 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 21:47 , Processed in 0.060054 second(s), 20 queries .

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