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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-30 17:12:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
首先在Home/Controller下创建一个公共控制器PublicController
4 K( C+ V2 b4 N% r* C) o, A
  1. <?php
    - b1 v5 H. K( U: Y  |+ m5 r
  2. namespace Home\Controller;$ j+ y, C' \, }- \

  3. ) K$ U% e0 M. |9 X; x! k5 @
  4. use Think\Controller;3 }* s3 r  |+ S0 S2 n0 n/ ^
  5. use Think\Verify;
    7 d( g. c. ]6 a0 G9 h
  6. " A8 d0 ?8 @1 g& x1 U1 O( h
  7. class PublicController extends Controller
    4 ^# i3 Y3 I6 W5 G
  8. {
    1 p5 e% h: c/ W0 M8 G
  9. ) e6 R' s) s: _4 U5 [
  10. /* 生成验证码 */
    1 t3 J. \- X) k
  11. public function verify()+ O" e: C8 J9 Y; P
  12. {
    5 F$ c1 y: b9 o, o  s! K
  13. $config = [
    5 {/ k! V6 G4 g; C# O$ {; P* H
  14. 'fontSize' => 19, // 验证码字体大小
    $ A" H% y; o; n; |% l7 ]
  15. 'length' => 4, // 验证码位数3 h7 b7 P: H7 |1 P
  16. 'imageH' => 34
    6 `; \  ?/ K" X% F
  17. ];
    % q( F0 ]0 D: S* x
  18. $Verify = new Verify($config);+ ?9 V* ~9 F! \5 p
  19. $Verify->entry();# E( Z! R+ |% W
  20. }! V- A: c' @( Q- ^, {. a# f
  21. 2 J( {7 U! M' h2 S" T# x8 p
  22. /* 验证码校验 */" f$ B$ K( W+ z! k2 N; \( G
  23. public function check_verify($code, $id = '')
    & Y# C5 {" ?. B3 q- ^6 T/ [4 ~. a
  24. {
    / s' _! u0 n# U. Q3 h( p9 k
  25. $verify = new \Think\Verify();! l; B: i% s; o
  26. $res = $verify->check($code, $id);
    ! H. j: v( A6 ^0 s0 ^
  27. $this->ajaxReturn($res, 'json');
    ; r2 T& I7 O; w1 s. C! c! P
  28. }& L5 M1 B8 p3 I2 t/ E) O! @% r
  29. }
复制代码
8 C: F, p* m8 v, e

. W( ]* }1 x! a' w  |. }1 vverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
$ H0 I* T% P2 f, V: |check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。. q% M$ P, F0 X, Z' k. D0 k. t: n
前台模板页建立index.html9 ?/ |# C3 ]: F" c! `
  1. <div class="">
    # D9 j) a& @/ y
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify") y! y# E9 U1 Z+ p$ V3 K2 [- O
  3. name="j_verify" type="text" class="form-control x164 in">
    ' R& i5 U  E3 F/ Y5 p
  4. <img id="verify_img" alt="点击更换" title="点击更换": f. }7 ~* l* \$ U% Q$ ?2 k' ^9 e
  5. src="{:U('public/verify',array())}" class="m">8 V, b& t7 ~3 y' |' \0 r; b
  6. </div>
复制代码
; e# m3 G/ e$ V9 w9 P8 ^8 n1 T
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    2 V9 ?9 \+ F) n+ q3 z1 u
  2. var verifyURL = "public/verify";3 b8 x% }5 s; B! B* O
  3. var time = new Date().getTime();
    3 p& I; o, F5 |
  4. $("#verify_img").attr({% U, W/ P( S# P( ?. A# N9 M. k
  5. "src" : verifyURL + "/" + time# j6 A- |- w9 y5 Y6 s7 @: p' q, j
  6. });0 R1 [4 S* [" d# Q
  7. });
复制代码
) `7 i  ?+ i: t: G, p; P& F5 x
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
8 l4 D, a  A; c# w
  1. $("#j_verify").keyup(function() {' W# U" S3 l! m) F1 c7 \! z! k
  2. $.post("public/check_verify", {
    4 S: q1 a! [* d$ \
  3. code : $("#j_verify").val()
    2 U$ W& l' ?1 p( J9 e/ v
  4. }, function(data) {" s6 k7 {- [- ~% F6 l1 z$ L
  5. if (data == true) {" {" l9 @) R$ z& P
  6. //验证码输入正确- s( P/ y. L) x  B# a
  7. } else {
    % e+ l4 q& N" B# L6 a1 W* a. T
  8. //验证码输入错误/ P4 h$ U3 u7 |: J0 W3 P
  9. }2 ~( N$ h8 L* `" h' \( O
  10. });  R/ x% y9 j! V& c& ^
  11. });
复制代码
9 z9 S% H( e% p& d
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(& q( h2 L' n* y/ D
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
    / p6 V; ^2 }, \9 u7 p- B7 U
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合
    $ W; o8 {+ f4 M% [
  4.         'expire'    =>  1800,            // 验证码过期时间(s)
    3 z* D( w7 u8 d- Z/ r. N
  5.         'useZh'     =>  false,           // 使用中文验证码 . E# e* K4 M/ U
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串
    ) D5 Y1 |  e5 b3 r
  7.         'useImgBg'  =>  false,           // 使用背景图片
    / X4 ]: x1 [) K" u9 r
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)
    1 ]. \4 i% F! S$ d. W/ T7 [
  9.         'useCurve'  =>  false,            // 是否画混淆曲线
    2 J& C8 v. c, e! m: p
  10.         'useNoise'  =>  false,            // 是否添加杂点   
    # k9 o3 k1 |! e, x0 E7 I1 G
  11.         'imageH'    =>  0,               // 验证码图片高度7 n6 W6 d8 _7 j& p
  12.         'imageW'    =>  0,               // 验证码图片宽度
    ; R/ Z; |+ O6 B, q4 a5 V" n
  13.         'length'    =>  5,               // 验证码位数. \+ N6 K3 ^6 @$ m9 }
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取: t7 ^3 T* q( C1 L' d, B
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色
    # X- u+ j* }: P5 @0 B- `
  16.         'reset'     =>  true,           // 验证成功后是否重置, A2 y) w4 {$ T/ n& z" k$ v
  17.         );
复制代码

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

" E# [& [. h3 P2 g! T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 16:44 , Processed in 0.060723 second(s), 20 queries .

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