cncml手绘网
标题: 验证码第一次异步校验成功,二次失败问题解决 [打印本页]
作者: admin 时间: 2018-7-30 17:12
标题: 验证码第一次异步校验成功,二次失败问题解决
首先在Home/Controller下创建一个公共控制器PublicController
( i3 n) Z( J! i% i- <?php
1 ?. Z4 D( a% G0 s/ I# W9 @5 R - namespace Home\Controller;
# a$ d0 _5 e; p0 r2 Y; G3 L - - O( k5 I' V& |' b2 l2 f
- use Think\Controller;/ k* D: ^3 w5 d R0 I' u* v
- use Think\Verify;2 V( ]" l. E2 I5 Q7 `' j" w5 L
2 n" K, U8 ^$ _. X- A2 ~$ Q+ d- class PublicController extends Controller
0 c5 _5 t0 o- z' [) b - {
0 f# ^2 N: _ w7 K; U' T- Q
! j4 |, [% s6 H+ s! j# ]) f- /* 生成验证码 */
/ @0 X0 ^( L2 n+ V( W& { - public function verify()
2 [0 v) N9 M n) O( i - {
9 D* `: Q0 H' w# N- e - $config = [4 d9 W N1 M- Z8 H) v
- 'fontSize' => 19, // 验证码字体大小/ s. M3 M6 I( C5 N( P2 f+ K! I! T1 B
- 'length' => 4, // 验证码位数
- n+ E) e. }, I% V, T - 'imageH' => 34
4 v d) d& h5 U1 c - ];
9 {% N9 l1 T0 y+ M/ u - $Verify = new Verify($config);$ ?9 F' K7 B4 O" M7 B5 \
- $Verify->entry();
8 {( t; `; @% j& i - }
5 @. m0 I( q1 F$ S: o. `# q7 r! J - ) y. s! F, O! }: U
- /* 验证码校验 */
) u0 d" f$ P" y9 r$ G) a _ - public function check_verify($code, $id = '')' ]7 ^" Z( c. g; z% M( t
- {+ B" t) Z, N2 Q* k
- $verify = new \Think\Verify();8 q* o% M! p; `" _/ w
- $res = $verify->check($code, $id);
$ }8 ?1 Y/ ]6 K* B# \% t5 q - $this->ajaxReturn($res, 'json');
7 o$ h, L) F) A c I! k - }
2 `) K% @; S5 V+ g9 F& y - }
复制代码 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& ]
- <div class="">
# V: z1 w5 y# [9 _2 k5 b8 M - <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
9 V4 w2 |1 B2 x; H6 j7 ~; E - name="j_verify" type="text" class="form-control x164 in">
! f5 h% `& Q) ?/ w5 F& A! A - <img id="verify_img" alt="点击更换" title="点击更换") ~/ n% ~/ I4 b9 \0 H- Z
- src="{:U('public/verify',array())}" class="m">
! r% o& l6 L( w0 M5 H# C% V$ Y) k u4 \ - </div>
复制代码 % k8 Z: `; l# `6 o1 g
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
- $("#verify_img").click(function() {
- U1 N) G/ [/ F- x; _; I1 _2 o. p - var verifyURL = "public/verify";* v4 @( J6 R2 q+ p- d2 ] _: |
- var time = new Date().getTime();
# {% k' z+ D r! b6 q* a - $("#verify_img").attr({& F$ ~0 L+ ~6 b& a" O
- "src" : verifyURL + "/" + time
5 n" e7 }: J, M/ @2 V - });6 t/ D; @( f% m) b& U
- });
复制代码 + g; ~9 n p& ]9 I
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
* D7 b6 b+ g9 I9 l$ r$ |2 P. S- $("#j_verify").keyup(function() {; |6 t! b$ S. \ g
- $.post("public/check_verify", {
5 Q# m d' e& b) B; @ - code : $("#j_verify").val()0 `" K0 b/ X; v# r t8 b" ~; Z& g
- }, function(data) {
, C: Y2 U" [& y# e - if (data == true) {6 a& C+ [3 T& U- D6 s
- //验证码输入正确
$ A* C/ I- X" I0 \. e, F2 p - } else {
; o- S6 h5 [$ `# ^! H" }1 c - //验证码输入错误5 a! ?9 p- d5 G2 i
- }
- \* \/ W1 g# K/ o) Z - });
3 |& r4 N1 ]9 y! v0 Y& o: V - });
复制代码 5 o& |) ~# [( d' D2 t5 H
利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
- protected $config = array(
! G- E u, }! N% d J: W: u - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥( U, i& I( y# N ?9 }
- 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合
4 b& Q: U: I# ~, G& l! o- O) J% A$ R - 'expire' => 1800, // 验证码过期时间(s)
2 h9 S1 p' ?, w+ P; C6 \. x: A - 'useZh' => false, // 使用中文验证码
. @$ k1 K; i% R) M( B: U7 Z# n - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串) a+ l( M: i9 n! T2 z7 g
- 'useImgBg' => false, // 使用背景图片
8 n! Z9 C9 w- p v1 a1 S7 v3 k - 'fontSize' => 25, // 验证码字体大小(px)* k) [" l. U7 g% F. i+ L2 D
- 'useCurve' => false, // 是否画混淆曲线4 m9 _0 I# y( ?2 e& h# T
- 'useNoise' => false, // 是否添加杂点 l9 N, }8 a' p5 b% Q
- 'imageH' => 0, // 验证码图片高度" Z% C) r) y' H$ a/ J1 w
- 'imageW' => 0, // 验证码图片宽度
, |0 K/ }# w* i5 o" j - 'length' => 5, // 验证码位数/ v* h/ @5 L7 T! D" Q
- 'fontttf' => '', // 验证码字体,不设置随机获取
: S; l0 e# T4 e* g - 'bg' => array(243, 251, 254), // 背景颜色( k: F- K0 ~/ V) k' H
- 'reset' => true, // 验证成功后是否重置
6 G% k8 M: I& Z* \, Y" d - );
复制代码 ) 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 |