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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-30 17:12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先在Home/Controller下创建一个公共控制器PublicController
  a4 X4 D% k( W* I
  1. <?php/ e" m; d% o) p7 s; \. e7 z
  2. namespace Home\Controller;7 ^: o. Y: v1 k; H8 T' C, g
  3. 5 l8 g" g) ~5 S( ]2 x+ b
  4. use Think\Controller;! Q; K7 ~( m/ D4 [1 p" [
  5. use Think\Verify;
    ) t" N5 _$ J2 M3 r! b; b, [
  6. ; P5 Z5 ^$ V; C# z) g* ~* w2 B" W1 P
  7. class PublicController extends Controller4 m  Q  x: `! V: {, r; @3 D
  8. {$ ?; E$ |; ^( [" O5 q, ^6 a
  9. 5 u: R* ^7 s7 K: M) l7 q$ \
  10. /* 生成验证码 */$ C' W* l7 Z+ |7 t! t
  11. public function verify()
    * T  c( U6 h9 @5 I# e, h5 y
  12. {
    ! \- \; X; U- z9 I; X# Z( C
  13. $config = [- {  Z# \4 v, k! N- H( N
  14. 'fontSize' => 19, // 验证码字体大小" |9 [6 m) u  k' I2 }
  15. 'length' => 4, // 验证码位数; ?& ]. a& U$ \( I) u5 I, v$ R/ @
  16. 'imageH' => 346 o  M0 Y, y5 Y- Q. v
  17. ];
      _& H) h5 _" _& s% y  K
  18. $Verify = new Verify($config);
    - z5 X7 b  l0 ?5 J9 {  w
  19. $Verify->entry();( T& _( G/ e, _- d" n, A
  20. }0 r% @4 q  c! ?# \
  21. * x: v; c5 r- ~& W
  22. /* 验证码校验 */
    # n- D' N8 y' V* x  B, V
  23. public function check_verify($code, $id = '')  v0 ?$ ~0 [: _1 o* e" N! [& d
  24. {
      ]+ }7 q. p" w. {+ y0 x6 `" V
  25. $verify = new \Think\Verify();
    1 J3 m- U  h4 k0 Q
  26. $res = $verify->check($code, $id);3 U) f* j8 c8 N: [- J
  27. $this->ajaxReturn($res, 'json');
    ; l. [  z* a! y1 x2 c
  28. }8 h: b7 n1 K, u+ N% W
  29. }
复制代码
9 X/ l" w" P3 X0 c
% C0 _# d6 o3 [  p; S) n
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
, w4 U8 g( ]) s# o* I# Z  Xcheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。- g% V# l) u# p# X  G
前台模板页建立index.html. X0 l( [4 E" t5 z
  1. <div class="">
    ' P5 M! @/ W4 A1 ]# h
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
    . m9 v+ c7 v2 n
  3. name="j_verify" type="text" class="form-control x164 in">
    ' t' y& u1 }5 W; @$ x, I
  4. <img id="verify_img" alt="点击更换" title="点击更换"
    , y) v" ^/ k& U+ X. k$ B
  5. src="{:U('public/verify',array())}" class="m">
    ) ^8 \. i0 E& l+ p# @
  6. </div>
复制代码
, [9 m( F$ x$ f0 H% U+ Q6 R
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {+ V& l8 c  J; l' }$ v2 z, n
  2. var verifyURL = "public/verify";
    0 {6 |1 e) x/ r1 z9 @
  3. var time = new Date().getTime();, S7 H8 [# r/ N
  4. $("#verify_img").attr({
    ) F; U7 q: Z6 w* O
  5. "src" : verifyURL + "/" + time/ r/ E  a" z+ o  t0 ^
  6. });
    & O8 i2 L3 K& S1 g
  7. });
复制代码
) n# W7 M. r/ c  b
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

/ v5 C1 K) w+ H
  1. $("#j_verify").keyup(function() {
    * F1 h0 ~' f  \5 w4 g. d
  2. $.post("public/check_verify", {/ {. K9 e$ O4 _2 i& b/ D
  3. code : $("#j_verify").val(): h% q  s7 O( V  o/ b8 S- c
  4. }, function(data) {" K$ |% I7 Y* O2 G' B
  5. if (data == true) {
    : P" u3 I7 ^' w/ ?  O
  6. //验证码输入正确0 Q1 R* X1 W% E; _
  7. } else {  w9 [! t' X4 @0 T* U8 I
  8. //验证码输入错误
    , ]# a- A3 x# ^6 ~
  9. }# Z- G" @1 y% k4 y7 w
  10. });
    . R0 h" A1 `! \7 X# Z1 G
  11. });
复制代码
- F6 b) _3 B# o  X; [* Y) T
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    - N* u# K+ x, v- V3 i' N
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
    ( L: A" r8 {' t* R: x
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合) Z3 j+ e( ?9 Q; P9 q3 P
  4.         'expire'    =>  1800,            // 验证码过期时间(s), X2 I" u+ T' N0 R- D
  5.         'useZh'     =>  false,           // 使用中文验证码 0 V; m7 O! g3 J( ]4 C0 Q
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串
    9 L5 n1 s& L+ N: w" _/ V6 ]2 C' h9 W
  7.         'useImgBg'  =>  false,           // 使用背景图片
    9 Y% x  D0 ^3 g  ^2 J+ r
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)" _; |4 @( C8 I+ e" O' g# F! |
  9.         'useCurve'  =>  false,            // 是否画混淆曲线9 Q: i* t& O. i9 |/ S  a
  10.         'useNoise'  =>  false,            // 是否添加杂点   
    % Y7 ]3 s' r$ _( z: U' E( I6 E
  11.         'imageH'    =>  0,               // 验证码图片高度7 Z5 ^+ Z9 }- W  O) U0 S
  12.         'imageW'    =>  0,               // 验证码图片宽度5 W8 h* \" j# `, d/ X* i+ g
  13.         'length'    =>  5,               // 验证码位数9 G$ q, I3 c5 w& V$ r; J! W
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取
    4 o8 h3 \4 I: B" y1 U
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色
    3 t" F6 C3 I8 Y
  16.         'reset'     =>  true,           // 验证成功后是否重置
    % T0 x% h! m# N: }
  17.         );
复制代码

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

8 s! Z( Z( i1 Q3 f( M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-4 09:32 , Processed in 0.076030 second(s), 20 queries .

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