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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-30 17:12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先在Home/Controller下创建一个公共控制器PublicController
% A8 _6 Z& Q: d4 o# W( c& n
  1. <?php
    8 ^- L2 X/ z1 |0 q# \0 _. \
  2. namespace Home\Controller;
    7 c  n; }1 X' s
  3. 9 R6 z5 c: Z9 ?$ }" x6 X' ~0 L7 r
  4. use Think\Controller;
    6 h& l& Y0 E6 q$ a- v: u+ W  w
  5. use Think\Verify;6 k# d* u2 x: O) O* |6 @

  6. % Z. X" b$ A. ]7 o7 W* `
  7. class PublicController extends Controller
    ; J2 y4 S) [1 \1 D* K9 M
  8. {) Q5 a! w6 _: `7 W9 S; X% N3 p

  9. ) C1 M# L3 O. `: d$ ~+ ]2 n
  10. /* 生成验证码 */, M5 A! _5 `  W3 s2 z$ i7 W' l. U
  11. public function verify()
    8 F% e* k5 S; B, B! h3 Y  C
  12. {( {' r2 a" X! H# N
  13. $config = [
    / a( [4 L2 p9 W5 t1 d# a0 `
  14. 'fontSize' => 19, // 验证码字体大小
    ) Q1 `* _) f: t
  15. 'length' => 4, // 验证码位数
    ! e3 H/ N+ V& Y
  16. 'imageH' => 343 k8 n6 s) R! u7 Q5 n' r
  17. ];
    1 I6 w0 p4 @5 U0 K- M5 ]1 d! a1 \  V
  18. $Verify = new Verify($config);( p* t( n. [6 l7 ?& ~: r+ W
  19. $Verify->entry();
    1 l$ W2 }# Y# f8 d8 o
  20. }- d/ |8 q: f! O) l" a

  21. . y; V# j6 O! T: E
  22. /* 验证码校验 */
    ) `; g/ \+ e8 G, Y1 b
  23. public function check_verify($code, $id = '')
    4 Z: s/ N2 n; B
  24. {
    : `; \' N  Q! \9 ?
  25. $verify = new \Think\Verify();  w8 _1 B% I) L9 c8 x
  26. $res = $verify->check($code, $id);
    0 o, v) \- f8 ~! ?
  27. $this->ajaxReturn($res, 'json');
    . K- D" V: t$ W+ Z6 z
  28. }
    , R+ u/ r6 `- x! G: h3 G
  29. }
复制代码

; D) F5 P4 {: z, I, {, V, B
1 w* M9 x; K! p$ Sverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。" M+ [8 u% B% A- J9 F0 Y
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
7 C% @' A1 d% k前台模板页建立index.html
# w- {! p6 Z$ i) j
  1. <div class="">
    ! V" i" O+ N6 f; H
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"8 Q( @' L1 g9 \0 x
  3. name="j_verify" type="text" class="form-control x164 in">, G4 y' b3 P5 M- T' U9 y
  4. <img id="verify_img" alt="点击更换" title="点击更换"
    ' z  a0 U, v+ a6 v
  5. src="{:U('public/verify',array())}" class="m">* q/ u6 C" t6 H/ K# {( M1 G4 x
  6. </div>
复制代码

! }( X+ i+ Q! N0 S3 m
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {' v8 x* a9 G3 K* o, {
  2. var verifyURL = "public/verify";
    + R5 V! ]- d  V3 E
  3. var time = new Date().getTime();
    . a5 W5 S- E# D: s: k9 v3 ]
  4. $("#verify_img").attr({
    ) c1 f; p8 [2 T' E+ p. }  t
  5. "src" : verifyURL + "/" + time9 ]' \8 |5 f1 u6 j: l" l
  6. });
    & ?& v8 w) T/ o$ p- _
  7. });
复制代码

  N- I3 z6 B( w9 p5 D8 z: N8 t
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

0 i. {7 u6 X7 E# L& R% v
  1. $("#j_verify").keyup(function() {& X0 n" n" u9 ^& \  F: u
  2. $.post("public/check_verify", {3 E; W- N. J: {
  3. code : $("#j_verify").val()- o* G2 `* ]& s- e) \$ N
  4. }, function(data) {
    % q7 t7 @+ V- H% ^) S' P' k
  5. if (data == true) {
    # T+ C* z/ R; L
  6. //验证码输入正确
    # Y4 H5 ?4 X& ]9 o& C" w, N
  7. } else {" N' X6 V! Q; f
  8. //验证码输入错误
    5 Y/ Y  N4 B* h$ w+ F  K
  9. }+ x5 O: H4 U/ A1 b, z8 L9 S
  10. });
    . ?4 {& ~! n) `! q& q7 ]
  11. });
复制代码
, C' G( J* t7 \9 n7 D/ O
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(; v' c5 C. f$ q) ?
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
    % c$ R: [6 `" R1 r! y+ b- [
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合' i- A. A& R% ]2 p9 ]- A
  4.         'expire'    =>  1800,            // 验证码过期时间(s)
    - y( I1 j; H. n( G4 _
  5.         'useZh'     =>  false,           // 使用中文验证码
    7 }* g( O0 \, \4 q
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串+ N' c8 L5 i$ y* u
  7.         'useImgBg'  =>  false,           // 使用背景图片 ' K( \) r) x- \" g, s
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)
    * m, B) x! l0 _: S4 O4 X
  9.         'useCurve'  =>  false,            // 是否画混淆曲线# m0 c5 v, d2 Q9 [- P- {
  10.         'useNoise'  =>  false,            // 是否添加杂点   
    # i9 }& ^$ j1 s3 s/ C) B
  11.         'imageH'    =>  0,               // 验证码图片高度$ i( m; ~! V- |" g1 ]
  12.         'imageW'    =>  0,               // 验证码图片宽度. |3 a1 U/ T. G4 D; v& a. o9 w" E7 n
  13.         'length'    =>  5,               // 验证码位数  g& [/ D. M3 q* W8 N: E* C
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取
    7 G% G$ F/ q6 U' _  h
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色1 M1 u' j& r6 l# ~+ ?+ q, R
  16.         'reset'     =>  true,           // 验证成功后是否重置
    . s* V. h0 V: K0 p. O
  17.         );
复制代码
& V' l& i5 `) k9 K! ^% i5 Z7 K) r
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。

# V4 t5 s6 J' e& Z0 ~! J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-7-19 15:50 , Processed in 0.054640 second(s), 19 queries .

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