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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-30 17:12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先在Home/Controller下创建一个公共控制器PublicController
( ?1 L- T5 P5 Z- X
  1. <?php
    : L. c, d5 @" P" Z
  2. namespace Home\Controller;+ ^& T8 R+ T4 w; n

  3. 0 A3 q! @! [6 u+ Q. i% Y
  4. use Think\Controller;7 D: R; g- N# J7 \: R6 \4 |
  5. use Think\Verify;% ~0 g& d+ z3 ~* P( o5 [1 q
  6. ( n; \( @3 z9 H6 Q* w7 D) D: `
  7. class PublicController extends Controller. k4 q9 n* W/ W3 C" a& M& E
  8. {  i& O- C9 C. S5 k( J* ?
  9. 5 O+ g& B3 r7 \  _
  10. /* 生成验证码 */
    3 o+ H2 q- l0 }* R. U! V
  11. public function verify()/ o% h1 B9 D3 @: v/ e+ a$ U2 g% Z
  12. {
    + p0 L! B  x+ l* R/ Z1 F# I
  13. $config = [+ q$ T  ^8 x: r
  14. 'fontSize' => 19, // 验证码字体大小
      T! e! \8 C# p9 ~4 S4 _
  15. 'length' => 4, // 验证码位数
    8 C: a* j) B8 {, c. w- @: ~& T! N' Q
  16. 'imageH' => 34
    5 \  T9 r9 N) ?( W2 d
  17. ];
    ' X. f+ d! N: G" B$ m0 S- Q' X: P2 [
  18. $Verify = new Verify($config);5 d' J7 P8 ]0 M' n
  19. $Verify->entry();" L% n6 N+ n+ b- S6 P
  20. }
    ( S/ W, \  I. ?% l" Q
  21. 9 e! c; v) Q1 _2 M
  22. /* 验证码校验 */8 a( U$ }* U1 w% V3 B1 R( i: [. f
  23. public function check_verify($code, $id = '')0 e3 s2 [3 P+ p3 S8 P* m) `/ H5 }
  24. {
    , }4 S4 F; B; L; u8 D+ Y7 C
  25. $verify = new \Think\Verify();
    1 D5 z- B% b$ a$ j& v
  26. $res = $verify->check($code, $id);
    3 f) r' Q4 U6 t$ u1 [
  27. $this->ajaxReturn($res, 'json');/ W" X) b' @0 |
  28. }
    - o$ d7 R/ p. [5 X: C1 U* O# {6 _
  29. }
复制代码

  h5 ]6 _( B4 r1 V) |2 k8 n6 @5 }
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。2 t) K2 F8 K0 ~$ I
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
* o- U( u. ~5 v, d+ g6 m7 ?" y前台模板页建立index.html
- ]# @$ S6 R! ~  p4 C
  1. <div class="">+ S7 `$ m8 o" w$ V* N  @% T
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"5 Z% |! Y1 l" X7 P: A( s8 |
  3. name="j_verify" type="text" class="form-control x164 in">
    ! {% O# D( G% z/ Q  J
  4. <img id="verify_img" alt="点击更换" title="点击更换"
    5 j5 M% V1 f- ^3 }  Z9 q
  5. src="{:U('public/verify',array())}" class="m">  ]6 M: C& q; Y- @$ z
  6. </div>
复制代码
" H3 a$ b3 \( w
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {6 K, g- V9 |9 `% ]! z2 U
  2. var verifyURL = "public/verify";
    6 H4 q2 Q9 W3 S; C
  3. var time = new Date().getTime();5 x- w* e* s* h. {' I) \
  4. $("#verify_img").attr({
    ' h9 i! q5 N: J# N$ l
  5. "src" : verifyURL + "/" + time; _9 g/ Q" N. {4 Y7 z: [# v
  6. });2 p" m2 `% a$ G# u  T
  7. });
复制代码
  O! i% A0 ~4 z7 t( Y* a& r
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

2 g# F2 Y# H* e% T
  1. $("#j_verify").keyup(function() {
    4 f% c4 z, m3 S' V' o
  2. $.post("public/check_verify", {
    . a! z+ ?9 W2 v" }- Z" _9 y
  3. code : $("#j_verify").val()3 W" N( A" _) \3 o$ u
  4. }, function(data) {
    5 _" r# d& x; e* s1 j+ G/ q
  5. if (data == true) {4 L9 f" e8 D% p, c; r
  6. //验证码输入正确
    : p5 p( G/ ~! L0 D% H: T
  7. } else {" J4 a; {0 J5 R! t% K/ L8 A7 X
  8. //验证码输入错误
    1 \2 p' K, b4 h- N
  9. }
      R* P7 m2 i# S0 _- ?% v: p4 o/ |; J1 f
  10. });5 B$ J8 e; o( L, Y+ S2 I" o
  11. });
复制代码
% T0 G5 Z3 o) z% I$ w* V
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    7 R% N& u& \, H4 M7 j( F3 C5 N* `
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥3 ]+ o, U0 T1 C2 H" o  U7 W3 i
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合$ g' J9 Q  l. `" I* ^
  4.         'expire'    =>  1800,            // 验证码过期时间(s)
    7 a# l' T  O  y4 g% ?1 p
  5.         'useZh'     =>  false,           // 使用中文验证码 ) m, z, H; O* \
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串
    * G% _5 p! h4 e% |# v9 u
  7.         'useImgBg'  =>  false,           // 使用背景图片 + G. [6 u( V+ ~$ J' \
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)7 ]0 q0 Q) ^1 f
  9.         'useCurve'  =>  false,            // 是否画混淆曲线8 ?% V$ @' K6 N  |* u2 g
  10.         'useNoise'  =>  false,            // 是否添加杂点    : Z+ P. y: w" ]
  11.         'imageH'    =>  0,               // 验证码图片高度
    3 |/ M' P7 M0 T2 v+ ~! }
  12.         'imageW'    =>  0,               // 验证码图片宽度
    " O" l. Y- V% o* p2 u4 V
  13.         'length'    =>  5,               // 验证码位数
    $ T" p  Z7 y  v2 d0 u
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取
    - D7 T; D0 h* s
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色' M! @" M" z; t/ A/ b  _
  16.         'reset'     =>  true,           // 验证成功后是否重置" A3 i* R- H: f$ g
  17.         );
复制代码
$ ^% v* D$ T9 x  b, s5 T
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。

  |! c5 _- m, O8 L8 A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 03:19 , Processed in 0.067281 second(s), 19 queries .

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