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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-30 17:12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先在Home/Controller下创建一个公共控制器PublicController
  P+ |5 s. \% J( |
  1. <?php
    ) @% j3 }1 f/ O: m
  2. namespace Home\Controller;7 t( H5 l! }8 s: W9 h" c+ I

  3. + ^8 z+ |, E/ M  E
  4. use Think\Controller;
    # W& R! {# D/ @' I9 O9 P
  5. use Think\Verify;
    * h9 X) D4 B6 `3 j
  6. 0 e$ D7 s. l2 ?" k, Q: u- D
  7. class PublicController extends Controller
    ) U5 \+ I, A  @! ?- U$ h9 E
  8. {# u$ R& o  v9 o5 h% ^7 n% l! S. m* |2 r3 K
  9. 1 Y: ~0 E2 \& L6 ^& T. R3 @
  10. /* 生成验证码 */
    ' u; p7 \- y. x  k4 l: c3 T
  11. public function verify()
    # G2 ~5 M, Z1 B% ^5 t
  12. {
    3 ]$ {( U$ v8 a
  13. $config = [- {# K0 f' L( }5 H% c" ^0 b
  14. 'fontSize' => 19, // 验证码字体大小+ D' [* s; S+ S" a/ t3 e; e- X- v
  15. 'length' => 4, // 验证码位数2 Q6 P; d. p# g1 g0 O' c  c7 O$ u
  16. 'imageH' => 34
    + q3 H& v( A& Q1 ^1 D
  17. ];
    0 Q& w) c# N, A* g
  18. $Verify = new Verify($config);; R8 j" y5 A0 d, J
  19. $Verify->entry();* [; J5 w/ X, s3 x# W5 Y
  20. }
    . ^9 j) F# o$ Y+ E2 |& g
  21. ' Z/ D& t! r3 m: F# F; `
  22. /* 验证码校验 */6 r3 W" O! d" y( Z2 r
  23. public function check_verify($code, $id = '')
    , U# Q  M; k, y' J) {
  24. {
    3 d/ e: _0 I" ~+ J* I$ I
  25. $verify = new \Think\Verify();/ k3 E" f& w3 T% A9 N& }- u# r
  26. $res = $verify->check($code, $id);
    & K1 a1 {: p7 U8 h  z5 h5 \  J
  27. $this->ajaxReturn($res, 'json');+ M* M0 t+ L2 K
  28. }6 e7 x2 Q( j8 b1 I$ `
  29. }
复制代码
- y, s8 U5 I/ h
  y7 P; j6 c- n8 I0 w
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。5 v# t1 ^& K2 b+ z. ?" e# n/ `( V) L  M
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
# j* A! a) H  }; ]' X前台模板页建立index.html: j4 x7 t- T4 P
  1. <div class="">9 l4 k) Z6 ~& u0 d: T3 ^2 V
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
    2 q- l( C" X" L# }5 ?
  3. name="j_verify" type="text" class="form-control x164 in">: A5 ~" W4 W! a1 a
  4. <img id="verify_img" alt="点击更换" title="点击更换"
    # Q, @4 W$ Q! z
  5. src="{:U('public/verify',array())}" class="m">
    $ p& |1 l% A- u0 d% p
  6. </div>
复制代码

0 p# w9 @1 f4 q! {
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    . S2 _  ]" D( F
  2. var verifyURL = "public/verify";
    5 J" @# h" o5 F  N% Y1 e" ~
  3. var time = new Date().getTime();
    . i) Y& Q$ R9 u1 c, E& ~
  4. $("#verify_img").attr({# @& _! M- }& j' ?- S6 q$ I1 r  o
  5. "src" : verifyURL + "/" + time
    % Z" h' [8 e5 R+ W' s9 O4 ^
  6. });
    # r( U5 E8 T  |0 I2 L# |( |. q
  7. });
复制代码

* v+ A+ d6 w1 U) e) U% @9 a
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
: K& f- d1 H+ y$ v' a9 t! V2 K
  1. $("#j_verify").keyup(function() {2 E+ h- A5 r* y0 Z0 v# x" v, F* s
  2. $.post("public/check_verify", {
    6 J4 ]1 O* T: a. p( a5 s
  3. code : $("#j_verify").val()" X9 E4 |6 z, Z" E+ W. h  N- l
  4. }, function(data) {+ L% ?4 h9 N2 t0 C) ]  o
  5. if (data == true) {
    & C* ^( \/ i" q" F
  6. //验证码输入正确" ~5 I9 o2 B: f; m9 c! b3 O" m
  7. } else {
    ; f- q) K! N1 {$ ~4 N, l
  8. //验证码输入错误
    9 B) ]. }6 Z1 H+ D7 Y7 d* B0 t
  9. }9 N6 f/ @) @- w( E# S$ B# t& W- ^
  10. });% Z0 Y9 s, M0 d: E1 d
  11. });
复制代码

" ]( r# E- W) A9 @/ q$ y- x: t
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    ( r: L1 P" g+ V% @8 O; X
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
    / `2 R6 b2 {8 Z% s3 Y+ K3 o8 j
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合( d" \* Y1 Y! {) R
  4.         'expire'    =>  1800,            // 验证码过期时间(s)& h0 }: ?7 ?7 n" T# C
  5.         'useZh'     =>  false,           // 使用中文验证码
    3 E$ `- _) \. y6 w+ G" q
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串* i) T+ \' q2 @: Q
  7.         'useImgBg'  =>  false,           // 使用背景图片
    , I. M8 r/ ]0 a# G
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)1 _9 t. E: O" p: X& S
  9.         'useCurve'  =>  false,            // 是否画混淆曲线
    7 |% R% a4 Y3 r- O3 M" a, @
  10.         'useNoise'  =>  false,            // 是否添加杂点    0 i* R+ u  p8 F* T7 V
  11.         'imageH'    =>  0,               // 验证码图片高度7 t. K/ E, K& I, G; }
  12.         'imageW'    =>  0,               // 验证码图片宽度# A+ Y6 X& i2 s3 B6 I
  13.         'length'    =>  5,               // 验证码位数
    ; ~8 G8 `% z6 G( O- I
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取6 w) n8 S- h5 a. c1 F
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色
    1 K9 ?7 g# D2 n
  16.         'reset'     =>  true,           // 验证成功后是否重置  [3 W5 [- X: T4 Z9 q9 d
  17.         );
复制代码

0 \- T9 R- X# m; j, }
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
7 c* d8 A6 `+ L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-23 03:32 , Processed in 0.126306 second(s), 22 queries .

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