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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-30 17:12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先在Home/Controller下创建一个公共控制器PublicController
" k" P0 z0 |# C$ C6 ]5 P" u
  1. <?php
    5 c+ z/ m& h( j- ~- ~  k8 G
  2. namespace Home\Controller;6 s& \- p1 P6 L, J3 p8 H' Z7 m
  3. 8 K% k6 i& ~9 B8 Y/ R
  4. use Think\Controller;0 E; z; W# m% I8 }4 Y# Q" V: k
  5. use Think\Verify;
    3 f* n4 C" `; W
  6. 6 g* @' M6 Z  x* g5 u
  7. class PublicController extends Controller
    % M- x. @) N9 |/ A+ }
  8. {
    $ ^# V) ?2 h( B/ g: L3 T
  9. & b" _5 k  Y" Y1 ]
  10. /* 生成验证码 */
    8 L3 M. s$ i7 A
  11. public function verify()3 ^. [. w0 z( g0 l6 E
  12. {
    7 _2 o2 |) y: ]9 d& U2 \8 U* u
  13. $config = [! C( c+ n0 y$ ~4 Q1 R
  14. 'fontSize' => 19, // 验证码字体大小& k; @# n! ^0 q" {. y
  15. 'length' => 4, // 验证码位数9 U7 `$ A: N! K( m+ i5 l1 w
  16. 'imageH' => 348 |( }* e6 e2 E6 V
  17. ];  b- q9 X, D6 ]) B+ Y; P" T4 e6 C4 S
  18. $Verify = new Verify($config);- J0 v" f  r& E# m: |# Y% m
  19. $Verify->entry();
    0 T9 a  @. l' F# Q, w
  20. }0 ^+ I1 V4 A5 \6 B3 t3 M- o& ?( w0 O1 C

  21. ( `( \" A# U4 Y1 U5 e
  22. /* 验证码校验 */. ]3 O# @* Q& J) V2 n: c
  23. public function check_verify($code, $id = '')+ v- F  P7 R% ^/ e9 W
  24. {" [) ^4 C4 j" N- O' g! D9 D
  25. $verify = new \Think\Verify();: q+ t* _: l  }
  26. $res = $verify->check($code, $id);% o7 x  U+ A$ d
  27. $this->ajaxReturn($res, 'json');
    0 o- x; _- S, A  @7 Q7 R5 ^
  28. }
    " A# I6 Q4 l: C' Y) [1 f* x/ E0 b
  29. }
复制代码
1 f+ w% `% x) d4 d8 L
# `8 z( n7 s# g7 ^# H
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。3 i2 {" P2 D1 z, ?( n1 D- `
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。2 w% v2 C! [% p, {/ x$ y' S
前台模板页建立index.html7 p+ V$ T% R( Q) I. f% p
  1. <div class="">3 H% S3 x/ q" f& I/ ^, B
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"7 D6 T# r' [7 {+ s. R" Q4 ?
  3. name="j_verify" type="text" class="form-control x164 in">" r. d4 I+ x5 I8 A3 k0 [8 C
  4. <img id="verify_img" alt="点击更换" title="点击更换"/ o1 R2 K7 V' Q  ?: \2 K* ^1 ]
  5. src="{:U('public/verify',array())}" class="m">" t2 ~* w, R/ k" G2 T
  6. </div>
复制代码

8 C% y; Q- P) j' z5 a' T1 l( n6 j- U$ q
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    + v9 M: Z; Q/ A) t& c9 K
  2. var verifyURL = "public/verify";
    : W! M1 l/ D  i0 a' f8 _7 v2 p' Q
  3. var time = new Date().getTime();8 _8 P4 N; v, Z- T$ P, K
  4. $("#verify_img").attr({
    9 U' V# G. |& v7 o5 T
  5. "src" : verifyURL + "/" + time5 O% O$ ?' H# Q+ x- c5 Q6 }
  6. });
    0 Q' M& ]! N+ ?" D2 T# C/ Q9 M+ N
  7. });
复制代码

2 S$ b- k/ `, i1 \# A  b
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

3 w  G" t8 `4 p; ~
  1. $("#j_verify").keyup(function() {; R0 j- Z* P1 B$ {8 B4 z
  2. $.post("public/check_verify", {
    2 s4 }: e2 i5 v; @  L4 o
  3. code : $("#j_verify").val()3 V2 ^% d8 Z- o
  4. }, function(data) {
    9 a/ X0 E6 P- U$ G
  5. if (data == true) {5 S$ K& f  e7 V' L6 s7 o# ?, ^
  6. //验证码输入正确( f% Y. |$ o4 p$ Q! ^- F! f
  7. } else {
    - D+ j3 b" C  N7 r, N( o8 d
  8. //验证码输入错误
      X2 b7 A  a" Z/ x9 n
  9. }7 o3 m$ f  x% m( z( h/ `3 F
  10. });  ?* L- F+ h2 |2 }; I$ B# K
  11. });
复制代码

  V& L8 i, |% S- M7 a
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    & {: x3 L- |; x' H
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
    % H( h8 p' a( k' L7 M# A
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合+ b$ `. W$ |. b2 l! i. j% `
  4.         'expire'    =>  1800,            // 验证码过期时间(s)  [7 h- A+ e# z. e
  5.         'useZh'     =>  false,           // 使用中文验证码 # i. I* h8 M3 w' V2 }
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串! @% w8 x3 {5 m  B9 H% G9 U
  7.         'useImgBg'  =>  false,           // 使用背景图片 4 m# c) f# _* `+ Z2 j2 ?5 T
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)
    - x" M" e# w# o" y. t) O. ]" D
  9.         'useCurve'  =>  false,            // 是否画混淆曲线
    $ o1 P$ Y+ w: X; S
  10.         'useNoise'  =>  false,            // 是否添加杂点   
    1 G  H6 M) o$ n4 s, n  D
  11.         'imageH'    =>  0,               // 验证码图片高度
    6 t; A5 o. _( n
  12.         'imageW'    =>  0,               // 验证码图片宽度
    ' v1 e* Y6 L+ [' }* X. s& ~5 K
  13.         'length'    =>  5,               // 验证码位数# z9 x$ R7 u) I* O: s
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取. f$ e4 Q6 q/ u! T+ \
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色
    . w* b3 d& J2 H# C2 ?
  16.         'reset'     =>  true,           // 验证成功后是否重置8 N1 f2 x. S! s" L# P. j
  17.         );
复制代码

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

' r% n8 q- p! O& I9 ?0 n0 N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 23:28 , Processed in 0.062112 second(s), 21 queries .

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