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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

* q: Z- H3 X6 }: U7 A' F
  1. <?php
    ' T& A) y* F" z
  2. namespace Home\Controller;$ @& W7 ~' ~; S$ m0 g. [

  3. , V: n" i4 ^( _4 S
  4. use Think\Controller;+ G: t' ~' x5 L2 R
  5. use Think\Verify;  ^- }! K5 S2 {8 ?+ Q3 s1 R6 O; C: ^: _

  6. * P" F+ F9 k: r! s. O' J5 c
  7. class PublicController extends Controller  h6 h; n/ x+ v& G
  8. {& u, j" u7 I3 F9 t& L; W+ a

  9. : i% T1 J/ M, g  S2 e
  10. /* 生成验证码 *// G) G9 G  K  t$ M  Z" F
  11. public function verify()
    3 q; b: C- z" [! U- r8 e6 W
  12. {
    ( r+ K5 B1 j9 f3 g
  13. $config = [
    ( I, K1 o6 e8 l) J+ {
  14. 'fontSize' => 19, // 验证码字体大小3 o5 X$ I/ |" y) \# [
  15. 'length' => 4, // 验证码位数
    8 j5 x: t6 o8 C. W, {* j
  16. 'imageH' => 343 S) C; f1 Z0 t& c" l% D
  17. ];
    ; k0 Z- g" E- _
  18. $Verify = new Verify($config);% Y0 S7 p- R- a; [2 w9 K) X; N
  19. $Verify->entry();
    & v6 U/ m0 F8 P" v1 B" [
  20. }1 W- r# W; x' C3 [

  21. ; O0 n! o+ k, A6 I
  22. /* 验证码校验 */
    6 ?. b  n5 L& S0 T3 s6 c
  23. public function check_verify($code, $id = '')
    ' i  \6 k6 k% @
  24. {
    4 J' y+ m- i  |9 P9 ]
  25. $verify = new \Think\Verify();& {/ m$ a- q! A
  26. $res = $verify->check($code, $id);5 Q$ [% h3 q  p  K# |9 V
  27. $this->ajaxReturn($res, 'json');
    ! p! [* o3 d/ J9 M- Y
  28. }- K& E% N4 m4 m3 o$ H+ g1 U8 u
  29. }
复制代码
0 t2 J5 Z, R1 w

) @+ @% ^/ J- v9 k- p/ jverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。) @9 N! U0 ~" @$ D7 r% k
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
* ?% }& Q& @& l" X( P' N$ k前台模板页建立index.html
! e" }* \5 L9 i) {
  1. <div class="">. ?# B# r" i( B( a  L7 d
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
    7 U% e" i- C0 b) Z( h; K% K
  3. name="j_verify" type="text" class="form-control x164 in">( Y0 M/ q  w& f& t/ ^  X
  4. <img id="verify_img" alt="点击更换" title="点击更换"# U. T+ Y; m) K1 T
  5. src="{:U('public/verify',array())}" class="m">/ j1 n' i1 M; J; ^% z
  6. </div>
复制代码

; \% W2 p* U! `' x- Q) Z
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {8 o" ~& }' o3 P% |/ G7 s% B
  2. var verifyURL = "public/verify";
    5 |% H; q6 N; j6 I: y
  3. var time = new Date().getTime();/ P  m% F7 b  Y' g
  4. $("#verify_img").attr({
    5 k, w3 s; p2 E% P
  5. "src" : verifyURL + "/" + time) b& m8 ?4 M* V  W$ S& P
  6. });7 q' Z; D" H+ ~$ }6 n) w. |
  7. });
复制代码

6 e9 {( r) X( }5 f- q+ h- |
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

7 R5 w  e  j  y
  1. $("#j_verify").keyup(function() {+ H) s0 N0 h5 r" g% i4 y6 R2 I
  2. $.post("public/check_verify", {
    1 n; V! a) l5 J7 x) R
  3. code : $("#j_verify").val()
    / g2 @* X$ x1 X: w
  4. }, function(data) {+ E1 f2 K7 }4 U( J3 o
  5. if (data == true) {; I6 o3 @3 r' N
  6. //验证码输入正确# h7 ?* m3 `" R4 K
  7. } else {
    8 {$ C2 M! J6 q
  8. //验证码输入错误
    1 `5 r. u# N% z) ?: ]; w* u4 Z
  9. }
    5 R$ k4 m% a+ D8 A0 z% j
  10. });' E/ z; Q& z/ d( {  t9 |* R
  11. });
复制代码

* ~9 g$ M/ T7 R/ e0 I+ v- V' k9 {
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    2 g" A( @" z0 G0 E+ X$ e
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
    8 k* a6 z% I; m
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合/ w1 G+ e2 Q% }) w) M% _8 c5 G
  4.         'expire'    =>  1800,            // 验证码过期时间(s)3 o9 ~: G" }) [- J7 M' l/ x/ e
  5.         'useZh'     =>  false,           // 使用中文验证码 7 I: q' L) x  j/ ~1 E) p
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串3 d, x9 V9 j( T) N
  7.         'useImgBg'  =>  false,           // 使用背景图片
    . Y6 j8 ]1 s: |* |- G
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)
    0 I  \: Q) Q" ?- y" ^1 v: B+ d
  9.         'useCurve'  =>  false,            // 是否画混淆曲线/ {5 B; O* B1 N1 ]$ a# _
  10.         'useNoise'  =>  false,            // 是否添加杂点   
    : o- A4 _' z7 B" W3 |" s
  11.         'imageH'    =>  0,               // 验证码图片高度" p; t( Z; w1 |+ r. j# H% f( E
  12.         'imageW'    =>  0,               // 验证码图片宽度4 H) }4 V/ b& g5 B9 Q
  13.         'length'    =>  5,               // 验证码位数( A# B* o. N+ H% X  v
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取9 L: x  V' g6 n( d, ?) ^
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色
    4 Z( d0 x! S% m4 v5 f
  16.         'reset'     =>  true,           // 验证成功后是否重置: x" s8 @" C7 g/ G; L
  17.         );
复制代码
3 w6 `- K+ Z$ t$ ?
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。

# h) o, u* ]& Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-7-19 15:52 , Processed in 0.055252 second(s), 19 queries .

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