cncml手绘网

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

作者: admin    时间: 2018-7-30 17:12
标题: 验证码第一次异步校验成功,二次失败问题解决
首先在Home/Controller下创建一个公共控制器PublicController

( i3 n) Z( J! i% i
  1. <?php
    1 ?. Z4 D( a% G0 s/ I# W9 @5 R
  2. namespace Home\Controller;
    # a$ d0 _5 e; p0 r2 Y; G3 L
  3. - O( k5 I' V& |' b2 l2 f
  4. use Think\Controller;/ k* D: ^3 w5 d  R0 I' u* v
  5. use Think\Verify;2 V( ]" l. E2 I5 Q7 `' j" w5 L

  6. 2 n" K, U8 ^$ _. X- A2 ~$ Q+ d
  7. class PublicController extends Controller
    0 c5 _5 t0 o- z' [) b
  8. {
    0 f# ^2 N: _  w7 K; U' T- Q

  9. ! j4 |, [% s6 H+ s! j# ]) f
  10. /* 生成验证码 */
    / @0 X0 ^( L2 n+ V( W& {
  11. public function verify()
    2 [0 v) N9 M  n) O( i
  12. {
    9 D* `: Q0 H' w# N- e
  13. $config = [4 d9 W  N1 M- Z8 H) v
  14. 'fontSize' => 19, // 验证码字体大小/ s. M3 M6 I( C5 N( P2 f+ K! I! T1 B
  15. 'length' => 4, // 验证码位数
    - n+ E) e. }, I% V, T
  16. 'imageH' => 34
    4 v  d) d& h5 U1 c
  17. ];
    9 {% N9 l1 T0 y+ M/ u
  18. $Verify = new Verify($config);$ ?9 F' K7 B4 O" M7 B5 \
  19. $Verify->entry();
    8 {( t; `; @% j& i
  20. }
    5 @. m0 I( q1 F$ S: o. `# q7 r! J
  21. ) y. s! F, O! }: U
  22. /* 验证码校验 */
    ) u0 d" f$ P" y9 r$ G) a  _
  23. public function check_verify($code, $id = '')' ]7 ^" Z( c. g; z% M( t
  24. {+ B" t) Z, N2 Q* k
  25. $verify = new \Think\Verify();8 q* o% M! p; `" _/ w
  26. $res = $verify->check($code, $id);
    $ }8 ?1 Y/ ]6 K* B# \% t5 q
  27. $this->ajaxReturn($res, 'json');
    7 o$ h, L) F) A  c  I! k
  28. }
    2 `) K% @; S5 V+ g9 F& y
  29. }
复制代码
3 W9 C; W3 E, f' U' ?$ B

/ R, u  x/ U( mverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
, `/ Z# L& ~, jcheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
  J% U: k1 t. d6 Q" l前台模板页建立index.html9 o2 b  F* s! C% R1 z7 n& ]
  1. <div class="">
    # V: z1 w5 y# [9 _2 k5 b8 M
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
    9 V4 w2 |1 B2 x; H6 j7 ~; E
  3. name="j_verify" type="text" class="form-control x164 in">
    ! f5 h% `& Q) ?/ w5 F& A! A
  4. <img id="verify_img" alt="点击更换" title="点击更换") ~/ n% ~/ I4 b9 \0 H- Z
  5. src="{:U('public/verify',array())}" class="m">
    ! r% o& l6 L( w0 M5 H# C% V$ Y) k  u4 \
  6. </div>
复制代码
% k8 Z: `; l# `6 o1 g
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    - U1 N) G/ [/ F- x; _; I1 _2 o. p
  2. var verifyURL = "public/verify";* v4 @( J6 R2 q+ p- d2 ]  _: |
  3. var time = new Date().getTime();
    # {% k' z+ D  r! b6 q* a
  4. $("#verify_img").attr({& F$ ~0 L+ ~6 b& a" O
  5. "src" : verifyURL + "/" + time
    5 n" e7 }: J, M/ @2 V
  6. });6 t/ D; @( f% m) b& U
  7. });
复制代码
+ g; ~9 n  p& ]9 I
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:

* D7 b6 b+ g9 I9 l$ r$ |2 P. S
  1. $("#j_verify").keyup(function() {; |6 t! b$ S. \  g
  2. $.post("public/check_verify", {
    5 Q# m  d' e& b) B; @
  3. code : $("#j_verify").val()0 `" K0 b/ X; v# r  t8 b" ~; Z& g
  4. }, function(data) {
    , C: Y2 U" [& y# e
  5. if (data == true) {6 a& C+ [3 T& U- D6 s
  6. //验证码输入正确
    $ A* C/ I- X" I0 \. e, F2 p
  7. } else {
    ; o- S6 h5 [$ `# ^! H" }1 c
  8. //验证码输入错误5 a! ?9 p- d5 G2 i
  9. }
    - \* \/ W1 g# K/ o) Z
  10. });
    3 |& r4 N1 ]9 y! v0 Y& o: V
  11. });
复制代码
5 o& |) ~# [( d' D2 t5 H
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(
    ! G- E  u, }! N% d  J: W: u
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥( U, i& I( y# N  ?9 }
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合
    4 b& Q: U: I# ~, G& l! o- O) J% A$ R
  4.         'expire'    =>  1800,            // 验证码过期时间(s)
    2 h9 S1 p' ?, w+ P; C6 \. x: A
  5.         'useZh'     =>  false,           // 使用中文验证码
    . @$ k1 K; i% R) M( B: U7 Z# n
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串) a+ l( M: i9 n! T2 z7 g
  7.         'useImgBg'  =>  false,           // 使用背景图片
    8 n! Z9 C9 w- p  v1 a1 S7 v3 k
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)* k) [" l. U7 g% F. i+ L2 D
  9.         'useCurve'  =>  false,            // 是否画混淆曲线4 m9 _0 I# y( ?2 e& h# T
  10.         'useNoise'  =>  false,            // 是否添加杂点      l9 N, }8 a' p5 b% Q
  11.         'imageH'    =>  0,               // 验证码图片高度" Z% C) r) y' H$ a/ J1 w
  12.         'imageW'    =>  0,               // 验证码图片宽度
    , |0 K/ }# w* i5 o" j
  13.         'length'    =>  5,               // 验证码位数/ v* h/ @5 L7 T! D" Q
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取
    : S; l0 e# T4 e* g
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色( k: F- K0 ~/ V) k' H
  16.         'reset'     =>  true,           // 验证成功后是否重置
    6 G% k8 M: I& Z* \, Y" d
  17.         );
复制代码
) s7 d* b0 O1 H" ~5 A4 M
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。

+ D+ W& [4 J  B# G




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