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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

( J( n% |8 h% o# [+ c9 I; F, w6 d% v1 _
  1. <?php
    - q) t" J1 y5 i9 C$ z' O# A# E
  2. namespace Home\Controller;
    0 [# h0 l" z3 J3 w5 U5 m3 m% q

  3. 3 X9 U: `6 z6 A7 r3 ^5 g5 \
  4. use Think\Controller;' X  E  @/ Q$ R, r9 ?8 r$ H2 X
  5. use Think\Verify;) [* p2 g+ I8 |' p& j, P) Y
  6. $ w- p/ ^+ @1 m
  7. class PublicController extends Controller
    , u8 Y! y, A- V2 Z) H: [
  8. {4 b# _2 |& {& q

  9. $ G5 F. n  M! g% b6 V( H( V
  10. /* 生成验证码 */
    . f* h! s. R8 ?
  11. public function verify()& Q+ `, B( u2 a' r% }
  12. {+ z. N' w4 A" s' E' V
  13. $config = [
    / @* r% g2 L! e" `# K' Y$ s
  14. 'fontSize' => 19, // 验证码字体大小6 M: ~* |8 R: j3 }2 d# f
  15. 'length' => 4, // 验证码位数
    9 t/ c$ e" ^' O' O
  16. 'imageH' => 34
    0 a4 _) f8 G2 q
  17. ];
    0 t/ _1 z/ F+ P! B
  18. $Verify = new Verify($config);1 R6 p. {2 Z' T$ J; w* H
  19. $Verify->entry();- Q" j4 ?- V0 c/ {. ^- Q9 M/ ^; j
  20. }: _4 X; J( B6 {; b1 l0 p( u: d) W+ L

  21. / e4 A! F& N- Q/ A: }4 s
  22. /* 验证码校验 */
    / I0 `9 X0 P; w0 c8 B& s7 k: w9 ]
  23. public function check_verify($code, $id = '')
    * L, t6 ^2 D0 s6 u! B
  24. {; @& y* ^/ @. o( l. B
  25. $verify = new \Think\Verify();+ {1 o3 m. R$ F
  26. $res = $verify->check($code, $id);
    * }% d  Z2 z) d- c
  27. $this->ajaxReturn($res, 'json');
    $ V+ ?. k$ A3 d+ d7 k
  28. }
    3 M  a( o9 t# x
  29. }
复制代码
' R/ f' b. |) r! o

+ X5 A8 t5 o9 X9 f3 h+ gverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。0 @! _: Y0 t: ~' l
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
, f1 y5 D# U1 ^: J# L* m* Y3 \前台模板页建立index.html
) f8 {3 W& Q* D* `7 F
  1. <div class="">
    1 n3 j. O( b% @9 z
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"0 G; Z6 c: v4 h; A5 T" N9 `
  3. name="j_verify" type="text" class="form-control x164 in">
    $ @) a3 y& s8 @( E" j$ ]
  4. <img id="verify_img" alt="点击更换" title="点击更换"- |& |7 Q. Y  O+ a% j
  5. src="{:U('public/verify',array())}" class="m">' U! N- V6 W1 k  O. S( ^5 p. |, J
  6. </div>
复制代码

/ J- E% D& L; k9 R2 m. [
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    " I; Q. m3 w( g
  2. var verifyURL = "public/verify";
    6 f6 @& R* l2 ^' q$ o0 R; u
  3. var time = new Date().getTime();# B3 o  B, D. ~, Q- e1 I. b* j
  4. $("#verify_img").attr({
    2 ~  f, O# {1 U6 L
  5. "src" : verifyURL + "/" + time
    $ F0 T6 p! Y0 D0 z
  6. });
    1 v) f( F3 P* O# R2 k# E* X
  7. });
复制代码
' n9 I( r" N( b5 W1 h
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

$ [, l4 A& i, S5 ]
  1. $("#j_verify").keyup(function() {
    4 o, d$ x  d  g- J' ^8 y5 W, F
  2. $.post("public/check_verify", {
    7 x7 i% i7 S' X* Z# O' n/ y) A1 z) N
  3. code : $("#j_verify").val()
    % O! |5 B9 Y# ?$ G1 s* B% X
  4. }, function(data) {3 _( Z' E, E# A" y; m5 N2 _
  5. if (data == true) {+ |: ^7 H* @9 y
  6. //验证码输入正确2 {9 I8 F: e" t$ L
  7. } else {) z: ?. M+ ~; j( p' R8 t
  8. //验证码输入错误9 j2 _* n7 `. {
  9. }" ]# u: o+ [* O* U7 |& {' X
  10. });
    2 c0 Q3 Y4 y! n( [  [/ I5 Y
  11. });
复制代码

5 u& e/ Q4 Z' j3 E& q
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    3 b9 k" _2 _5 i5 D; V0 p
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥" `- W! M6 H+ p
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合) B! G. L  F, E/ N
  4.         'expire'    =>  1800,            // 验证码过期时间(s)
    : ?4 {4 h8 G: z, n) \" i% a
  5.         'useZh'     =>  false,           // 使用中文验证码
    4 ?- H; }6 x& F" t- k
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串
    9 Y, c' f! H" W; V
  7.         'useImgBg'  =>  false,           // 使用背景图片
    7 I: e8 ?0 @1 N+ w7 }  p: `( s$ d
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)4 D0 }: h) J, l8 c7 k' ~
  9.         'useCurve'  =>  false,            // 是否画混淆曲线
    : g" Y" v* b0 A; O+ t0 A. ?' @
  10.         'useNoise'  =>  false,            // 是否添加杂点    + q- W" E# a5 K
  11.         'imageH'    =>  0,               // 验证码图片高度
    9 A/ D. H* M7 s5 v  [  O
  12.         'imageW'    =>  0,               // 验证码图片宽度
    " m* `" h3 S. x) ^: l5 L$ G0 _
  13.         'length'    =>  5,               // 验证码位数, @; ?- z# Z$ w1 A+ \* Z
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取- l! @; t: c" x6 R, F8 G' Z6 J
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色
    6 e+ ]3 j4 E. H8 Q4 l
  16.         'reset'     =>  true,           // 验证成功后是否重置
    4 `% P) W2 f1 u9 s6 X4 c
  17.         );
复制代码
. [" G4 `; A; r& j* `
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
" G2 }( [. _5 D( V% a9 Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 04:37 , Processed in 0.056895 second(s), 20 queries .

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