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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-30 17:12:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
首先在Home/Controller下创建一个公共控制器PublicController
1 z1 N: {6 y2 X+ c4 e1 u2 K- I
  1. <?php
    1 ~5 l9 \3 c; u% E5 u, U
  2. namespace Home\Controller;8 `) E2 G1 ]7 C+ H- f0 i- h

  3. 6 M8 H6 i( ~" v* @0 p% I6 ?) |
  4. use Think\Controller;
    . `% Y( x5 n- X) O* \
  5. use Think\Verify;
    9 n9 z4 E0 B$ a
  6. 5 Z2 S! @( K+ n* V% K! {  z' Q
  7. class PublicController extends Controller) E' e& f4 w0 j+ i
  8. {# ~6 a. s5 Y" g* ?9 L! y
  9. 0 \7 y1 @3 W$ }4 x& b. d6 h' g5 n& s/ u
  10. /* 生成验证码 */
    - x' X. @" B( y( [  ?
  11. public function verify()
    + }( H4 o/ ~5 R* b
  12. {8 S! Q; a# L5 k5 w
  13. $config = [
    , u! S7 W9 b) u& z; I. q# ?* Y
  14. 'fontSize' => 19, // 验证码字体大小' e$ i0 F, F, L, J1 [: [
  15. 'length' => 4, // 验证码位数( x& [( h9 v1 s  ~8 x6 u
  16. 'imageH' => 343 `7 i/ j: J$ D8 ]- {
  17. ];
    # X* i, i; r  _: s4 y  b2 v
  18. $Verify = new Verify($config);+ X. F8 D" X1 k3 b. C( x
  19. $Verify->entry();
    6 ~6 y' P  C% H; }: W
  20. }* w" i- O# |) m; V9 V' `4 V7 k
  21. . _1 E4 [' K* b5 d
  22. /* 验证码校验 */' f! u& @( I  {! B; M
  23. public function check_verify($code, $id = '')
    & [$ w; q$ H7 l2 r
  24. {2 o+ c, E# T6 P# @
  25. $verify = new \Think\Verify();
    * d* y$ t) D/ X  M$ ~1 k7 `
  26. $res = $verify->check($code, $id);
    % n% P3 q% f+ I, ^9 ?
  27. $this->ajaxReturn($res, 'json');8 l7 i8 F! j1 f+ k
  28. }
    : H  o/ o5 {; ?% V+ }
  29. }
复制代码

) A, s; X0 d! V) \% r& B$ ?( T6 Y$ Q7 _" h7 t0 E
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。6 k8 X. n' g4 t4 [
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
# Z8 I9 T9 k/ k2 I0 c5 z前台模板页建立index.html
4 X( k' X: P# n7 g+ P' ~  V1 ~# y
  1. <div class="">
    0 h$ B2 i* ]/ k6 `' O/ u! c
  2. <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
    % y/ @& R& _) d$ i5 j4 g
  3. name="j_verify" type="text" class="form-control x164 in">
    ' F; O/ `+ g7 W6 _. i
  4. <img id="verify_img" alt="点击更换" title="点击更换"
    ! O6 f* P5 X2 i; o- Z- Z/ {" ~( |
  5. src="{:U('public/verify',array())}" class="m">) W5 \8 p4 u! S$ J" d
  6. </div>
复制代码
" T1 V7 n4 y7 u: V; {3 @! {
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码
从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
  1. $("#verify_img").click(function() {
    ( x9 l$ V! Q' L- c  f) l4 O; b
  2. var verifyURL = "public/verify";. `+ r7 b' V$ b9 _- s* l
  3. var time = new Date().getTime();
    # S1 O, j2 M5 g! ?
  4. $("#verify_img").attr({2 p2 k' L$ g5 y: f* ?/ Q
  5. "src" : verifyURL + "/" + time! H3 z( m8 M; b! K
  6. });$ F- W. t1 m2 x2 F# e9 l" b
  7. });
复制代码
1 {% F5 `" z$ }! v3 {
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码
大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
, W' U& y( I$ ]) `9 C& O
  1. $("#j_verify").keyup(function() {7 B3 c/ y9 V# v# O
  2. $.post("public/check_verify", {. ?) h  q7 h& |
  3. code : $("#j_verify").val()/ W0 u6 M% M9 m* b& O
  4. }, function(data) {
    5 W1 b( T- h$ n8 [
  5. if (data == true) {
    6 r. s0 u) ^% o' F8 g
  6. //验证码输入正确
    5 R6 R3 e/ c/ |' W4 \' W) V
  7. } else {! ~4 F% j$ _, [! d# [& B" D6 u
  8. //验证码输入错误
    % l; F3 D/ G* Z# W/ K) A, r2 [
  9. }5 s' E3 F* [% ~, k* m
  10. });' u# s0 T8 V; R5 ?7 Y; K. a9 @
  11. });
复制代码
$ C% L* ~" {3 z3 Z
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:
当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
  1. protected $config =    array(8 a8 V) E) O/ b: a$ W, i; B
  2.         'seKey'     =>  'ThinkPHP.CN',   // 验证码加密密钥
    ( u( u5 P5 `, `8 l4 U
  3.         'codeSet'   =>  '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',             // 验证码字符集合# I: ]+ z' @/ c, p7 W
  4.         'expire'    =>  1800,            // 验证码过期时间(s)
    8 f+ ~5 Z1 n3 \9 G, i
  5.         'useZh'     =>  false,           // 使用中文验证码 3 N6 U* _4 z) S
  6.         'zhSet'     =>  '……此处不粘贴了,太多了!',              // 中文验证码字符串
    : c/ A1 ~+ v& L3 ?, O, u% I" n
  7.         'useImgBg'  =>  false,           // 使用背景图片
    0 S/ M/ h* c) i7 `  b
  8.         'fontSize'  =>  25,              // 验证码字体大小(px)
    - r1 x2 E1 d8 @/ X4 X9 U
  9.         'useCurve'  =>  false,            // 是否画混淆曲线' v) |+ j1 ?" X$ `& y
  10.         'useNoise'  =>  false,            // 是否添加杂点    ) E. Q) o! u, q2 r4 @
  11.         'imageH'    =>  0,               // 验证码图片高度
    * o* C2 I( M: t! p( w% Z' x9 m  K
  12.         'imageW'    =>  0,               // 验证码图片宽度6 b4 b4 E2 g) K, [- {
  13.         'length'    =>  5,               // 验证码位数
    / g  o! M) b3 t
  14.         'fontttf'   =>  '',              // 验证码字体,不设置随机获取
    , T# j. T/ U) p  N! [
  15.         'bg'        =>  array(243, 251, 254),  // 背景颜色
    8 M' x0 Z/ C: T7 z: A/ ]5 s
  16.         'reset'     =>  true,           // 验证成功后是否重置
    9 \7 D1 i  c4 |' |
  17.         );
复制代码
5 Q6 O. v6 Q% H4 d6 A
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。
好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
# }- M5 J* S6 Q; V4 B( W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-1 01:29 , Processed in 0.067585 second(s), 22 queries .

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