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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

* _8 d9 K* A. W/ s1 U
  1. <?php
    2 t3 b+ Z: n( X8 |$ w$ |% N# j) f5 E
  2. namespace Home\Controller;' n6 X4 B$ ]  h  e

  3. ) ~! m9 G/ L5 }
  4. use Think\Controller;
    4 Y& @4 W3 O, k' S5 K
  5. use Think\Verify;
    ) _: |* `- m3 n9 G% C/ [6 I$ |# D

  6. . |" y7 D3 [8 \- y; {' k# V
  7. class PublicController extends Controller! x- T& B9 w8 V# r! X7 w7 `
  8. {. D7 @- T0 I! }0 `- h1 y

  9. ( L* F9 B7 k# N
  10. /* 生成验证码 */
    ; ~( c# q9 w3 y: r  @$ c( j
  11. public function verify()$ s7 w- k, j% z/ f! W
  12. {! a- w$ b8 [6 l/ X7 i! ^
  13. $config = [' e; E( G3 F) i8 y8 [2 \2 c! a2 {
  14. 'fontSize' => 19, // 验证码字体大小  S( i  Z% e* R+ Y
  15. 'length' => 4, // 验证码位数8 C9 ?& `* E8 o# l  ?
  16. 'imageH' => 34
    0 ~1 q7 V  _5 V: g2 h
  17. ];
    : _" g4 }3 @+ a8 N1 r! f& Q5 `- y
  18. $Verify = new Verify($config);
      e+ P8 l9 n7 B! F* l
  19. $Verify->entry();( l; j$ j  [' d
  20. }
    : }) z  l+ Y" q2 ]5 O  C" q

  21. 6 Z/ M& {* D" `2 Y6 d( l
  22. /* 验证码校验 */+ _: ]0 G: O. j7 {6 G! X
  23. public function check_verify($code, $id = '')' ?! e8 u; [7 ^# p" w' h
  24. {
      t/ H, @; q1 c9 C
  25. $verify = new \Think\Verify();
    4 V" `+ q$ f& I$ L
  26. $res = $verify->check($code, $id);% U$ E% V$ g6 ?! n* p- l( s. M) v
  27. $this->ajaxReturn($res, 'json');
    , t; a7 y( d) @' `- a7 q% h" {
  28. }' p7 W0 V7 Y; ~* P3 A/ |7 M
  29. }
复制代码

3 V- p1 U. ~6 e& ]" g& F3 s; Q3 N+ T0 b
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。; @2 t0 I9 d% x2 s3 c6 L
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
  \7 Y: ^2 o2 }6 B& j* W2 a7 h  r5 m前台模板页建立index.html$ C$ r* q( C9 C" y- y0 g
  1. <div class="">
    7 s( a3 B5 y0 L# v7 j
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify", o1 m2 D$ l  S0 O% m
  3. name="j_verify" type="text" class="form-control x164 in">
    2 q/ d! T  \2 v7 u8 w/ O0 _
  4. <img id="verify_img" alt="点击更换" title="点击更换": }& x/ L( s! I  z, P1 {: X' z
  5. src="{:U('public/verify',array())}" class="m">5 e4 `: P# \0 w
  6. </div>
复制代码

- y9 J& a4 c" L, C8 I. K
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    6 \- n; C2 E1 v1 t0 ?
  2. var verifyURL = "public/verify";
    4 [5 z: F. e3 V3 w" n/ m
  3. var time = new Date().getTime();
    # r( N; R- W( N  d$ e& g& i& H
  4. $("#verify_img").attr({8 K. y* j5 K7 J) F/ m. V/ ]& G
  5. "src" : verifyURL + "/" + time- S. f) w# J% a6 Y; o
  6. });: G& G- l* k- q
  7. });
复制代码

) W7 J& `1 q) @# x, c0 \3 O
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
$ d* T2 ^1 A* z/ F. c: n
  1. $("#j_verify").keyup(function() {
    ; x: O# C% X3 ]7 }
  2. $.post("public/check_verify", {
    - J' F1 F+ U; Z+ A- p2 J
  3. code : $("#j_verify").val()
    $ n6 v8 x! Z2 s/ R- K, [4 u
  4. }, function(data) {4 l  S7 t/ j7 r6 Z# C% S" R* `8 @
  5. if (data == true) {/ s0 i$ s  j2 i6 R+ m0 D: ]4 v0 O- {
  6. //验证码输入正确  V9 i+ f3 X5 m
  7. } else {# A/ ?& m, V; m& T: i+ o
  8. //验证码输入错误( K# M8 ~" x2 o. t4 e
  9. }
    2 y8 u' W, m8 p( e9 }4 e) U
  10. });& X8 N: T# ?" |; ?" \
  11. });
复制代码
+ @- v1 A# n/ N. @
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    ) E" s+ Y$ j7 v1 T- g/ O; U2 ?0 v7 _
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥4 k  v' E, w, a) d
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合
    ' W4 c$ G0 V. c9 v
  4.         'expire'    =>  1800,            // 验证码过期时间(s)
    ) F$ H! u0 A! B. P$ ?' \
  5.         'useZh'     =>  false,           // 使用中文验证码
    , K7 Z) b( P2 B& E% M* }7 s
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串! G1 ^+ m& w, D$ P  {3 b
  7.         'useImgBg'  =>  false,           // 使用背景图片
    4 s* |6 s+ ?5 {5 O4 ?5 E0 G
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)
    / E0 w# A- s& J' x* u, _
  9.         'useCurve'  =>  false,            // 是否画混淆曲线( H& A; y2 e+ |, ?6 {
  10.         'useNoise'  =>  false,            // 是否添加杂点    : c$ Y) i/ {1 z2 s% z
  11.         'imageH'    =>  0,               // 验证码图片高度' Y3 E8 u5 G  R: j& N
  12.         'imageW'    =>  0,               // 验证码图片宽度3 q7 a4 d$ o0 {! G
  13.         'length'    =>  5,               // 验证码位数( g  B) Z" h% T+ @
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取
    & V. T$ x  U: f, [; t& z0 h* F- ~
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色7 _6 D0 \. B0 w$ p
  16.         'reset'     =>  true,           // 验证成功后是否重置
    9 f2 A/ |% K8 `  O
  17.         );
复制代码
, j5 @4 W2 _( Y- F
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
8 k* d# A' d* B, T! O3 D1 h; z+ a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-23 02:30 , Processed in 0.119776 second(s), 21 queries .

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