cncml手绘网

标题: 验证码第一次异步校验成功,二次失败问题解决 [打印本页]

作者: admin    时间: 2018-7-30 17:12
标题: 验证码第一次异步校验成功,二次失败问题解决
首先在Home/Controller下创建一个公共控制器PublicController
7 T3 N# |3 ]6 D5 i& c/ E2 c
  1. <?php
    0 y3 p; d1 u/ v& `( v7 W4 w. c' W5 L
  2. namespace Home\Controller;1 U! o; L( ?# Z! ]( o- m- f- [# ?) l
  3. " _7 C, N) c2 L% H" B/ L
  4. use Think\Controller;% I8 }& H7 @! W  B
  5. use Think\Verify;
    : F' }; B+ M: X. S2 T

  6. # w; j9 T# K' C! ^% r
  7. class PublicController extends Controller
    9 k6 J" w7 G  ?  y$ F1 x4 {8 @6 O: i
  8. {# Z7 b$ t' L. B9 C
  9. * Z" i# T1 s' T
  10. /* 生成验证码 */" q0 w2 y1 c' A7 O$ Q) t
  11. public function verify()8 u" U& m" r6 \/ t" G9 _
  12. {6 V) _& X1 t$ e: n6 M9 ?
  13. $config = [
    6 ~: C' }0 g( o2 b# ?/ ]
  14. 'fontSize' => 19, // 验证码字体大小
    . K  g) F9 I2 p! [- ~
  15. 'length' => 4, // 验证码位数
    6 u' s+ O, l3 z: x. m% W& ]
  16. 'imageH' => 34  }- h, C4 w0 c- e
  17. ];; h; R' Y  E, m2 G2 c6 D
  18. $Verify = new Verify($config);, o7 M( w* t% p5 R& W
  19. $Verify->entry();
    + y* h3 `6 a0 c( Z' o: m+ C
  20. }; R  K+ S- D3 F, q0 B

  21. % m& W- A# Z# `) X2 J
  22. /* 验证码校验 */- M' z% c2 ]1 g1 C( ~
  23. public function check_verify($code, $id = '')8 ^7 S; @2 [& f3 @0 \$ J( {
  24. {; d; H$ \3 }) Z+ A
  25. $verify = new \Think\Verify();$ a0 z7 k/ B  T) P7 y9 p4 X  @9 z( Z
  26. $res = $verify->check($code, $id);6 e* N* N7 u& G$ ^
  27. $this->ajaxReturn($res, 'json');
    . D* F) g( w1 N( j3 c9 J- x! Z
  28. }0 Q" n* b+ g* P: P
  29. }
复制代码

6 o. K. g! B0 _& C' e! {
  h3 e4 {$ v* j: @  b8 C" Kverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。" ^' h: \/ a8 v: E' h
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。' f6 O" k, U! i+ [' L
前台模板页建立index.html7 T  f, \1 m6 v. k  o, c
  1. <div class="">6 l9 h$ [7 \' s! K( O: B
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"" X$ M8 u1 c7 K: u3 J
  3. name="j_verify" type="text" class="form-control x164 in">
    ' g4 z6 k- {2 O3 d5 `& O" y
  4. <img id="verify_img" alt="点击更换" title="点击更换"/ Q2 G" [* M0 g2 v
  5. src="{:U('public/verify',array())}" class="m">
    4 Q. m) r. O7 F0 j! d  ]+ I
  6. </div>
复制代码
* ^) B% D' u8 l; t1 x. Z, s: r
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {& T7 A9 n$ X5 ~! z) L) |+ ~
  2. var verifyURL = "public/verify";
    # J6 B* |6 T2 v9 I
  3. var time = new Date().getTime();
    # D3 B, U7 C/ Z6 i3 [
  4. $("#verify_img").attr({) A0 [: w0 s+ m& N$ g
  5. "src" : verifyURL + "/" + time
    : M* v3 D+ C0 B& I8 D
  6. });6 V! s& R) R- n9 v
  7. });
复制代码
# O8 ~% _: n0 E3 @5 M+ ~
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
" p; Z7 ]8 X" w- ]$ o+ J4 _
  1. $("#j_verify").keyup(function() {( d( O5 ?7 ^! w8 Q% h+ E3 _! q8 B
  2. $.post("public/check_verify", {7 b' t0 X6 o2 c8 J* D8 _7 R
  3. code : $("#j_verify").val()) E9 j8 r* p5 z4 G6 U
  4. }, function(data) {$ J; y# F( |6 b7 i3 P
  5. if (data == true) {" a. z4 F' w- I1 v, h2 ~
  6. //验证码输入正确
    . s* n: L7 R/ \# m( E
  7. } else {
    3 ^$ u9 `9 j6 P4 G& j/ F4 e- v
  8. //验证码输入错误2 b% I! I5 T3 {# Q, e" L9 T# D
  9. }3 H4 n& C5 t6 r
  10. });
    * K8 n  ]* m7 u2 T6 l0 @/ K
  11. });
复制代码

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

+ E/ h% L( S, t+ n  l: F




欢迎光临 cncml手绘网 (http://cncml.com/) Powered by Discuz! X3.2