cncml手绘网
标题: 验证码第一次异步校验成功,二次失败问题解决 [打印本页]
作者: admin 时间: 2018-7-30 17:12
标题: 验证码第一次异步校验成功,二次失败问题解决
首先在Home/Controller下创建一个公共控制器PublicController
7 T3 N# |3 ]6 D5 i& c/ E2 c
- <?php
0 y3 p; d1 u/ v& `( v7 W4 w. c' W5 L - namespace Home\Controller;1 U! o; L( ?# Z! ]( o- m- f- [# ?) l
- " _7 C, N) c2 L% H" B/ L
- use Think\Controller;% I8 }& H7 @! W B
- use Think\Verify;
: F' }; B+ M: X. S2 T
# w; j9 T# K' C! ^% r- class PublicController extends Controller
9 k6 J" w7 G ? y$ F1 x4 {8 @6 O: i - {# Z7 b$ t' L. B9 C
- * Z" i# T1 s' T
- /* 生成验证码 */" q0 w2 y1 c' A7 O$ Q) t
- public function verify()8 u" U& m" r6 \/ t" G9 _
- {6 V) _& X1 t$ e: n6 M9 ?
- $config = [
6 ~: C' }0 g( o2 b# ?/ ] - 'fontSize' => 19, // 验证码字体大小
. K g) F9 I2 p! [- ~ - 'length' => 4, // 验证码位数
6 u' s+ O, l3 z: x. m% W& ] - 'imageH' => 34 }- h, C4 w0 c- e
- ];; h; R' Y E, m2 G2 c6 D
- $Verify = new Verify($config);, o7 M( w* t% p5 R& W
- $Verify->entry();
+ y* h3 `6 a0 c( Z' o: m+ C - }; R K+ S- D3 F, q0 B
% m& W- A# Z# `) X2 J- /* 验证码校验 */- M' z% c2 ]1 g1 C( ~
- public function check_verify($code, $id = '')8 ^7 S; @2 [& f3 @0 \$ J( {
- {; d; H$ \3 }) Z+ A
- $verify = new \Think\Verify();$ a0 z7 k/ B T) P7 y9 p4 X @9 z( Z
- $res = $verify->check($code, $id);6 e* N* N7 u& G$ ^
- $this->ajaxReturn($res, 'json');
. D* F) g( w1 N( j3 c9 J- x! Z - }0 Q" n* b+ g* P: P
- }
复制代码
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
- <div class="">6 l9 h$ [7 \' s! K( O: B
- <label for="j_verify" class="t">验证码:</label> <input id="j_verify"" X$ M8 u1 c7 K: u3 J
- name="j_verify" type="text" class="form-control x164 in">
' g4 z6 k- {2 O3 d5 `& O" y - <img id="verify_img" alt="点击更换" title="点击更换"/ Q2 G" [* M0 g2 v
- src="{:U('public/verify',array())}" class="m">
4 Q. m) r. O7 F0 j! d ]+ I - </div>
复制代码 * ^) B% D' u8 l; t1 x. Z, s: r
使用Thinkphp的U方法形成生成验证码的图片。
到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。
我们可以考虑实现public/verify/变量值的形式URL。
- $("#verify_img").click(function() {& T7 A9 n$ X5 ~! z) L) |+ ~
- var verifyURL = "public/verify";
# J6 B* |6 T2 v9 I - var time = new Date().getTime();
# D3 B, U7 C/ Z6 i3 [ - $("#verify_img").attr({) A0 [: w0 s+ m& N$ g
- "src" : verifyURL + "/" + time
: M* v3 D+ C0 B& I8 D - });6 V! s& R) R- n9 v
- });
复制代码 # O8 ~% _: n0 E3 @5 M+ ~
利用JS获取当前时间戳加入到URL之后即可。
到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。
异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
" p; Z7 ]8 X" w- ]$ o+ J4 _
- $("#j_verify").keyup(function() {( d( O5 ?7 ^! w8 Q% h+ E3 _! q8 B
- $.post("public/check_verify", {7 b' t0 X6 o2 c8 J* D8 _7 R
- code : $("#j_verify").val()) E9 j8 r* p5 z4 G6 U
- }, function(data) {$ J; y# F( |6 b7 i3 P
- if (data == true) {" a. z4 F' w- I1 v, h2 ~
- //验证码输入正确
. s* n: L7 R/ \# m( E - } else {
3 ^$ u9 `9 j6 P4 G& j/ F4 e- v - //验证码输入错误2 b% I! I5 T3 {# Q, e" L9 T# D
- }3 H4 n& C5 t6 r
- });
* K8 n ]* m7 u2 T6 l0 @/ K - });
复制代码
' [* y C/ K+ s9 a利用onekeyup。原理就不需要多讲了吧!
这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦!
还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上:
以下是该类初始的config配置:
- protected $config = array(
! X$ V H0 V4 g' _ - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥2 |+ n7 h% j" w6 C6 X
- 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合
& A& z6 n4 ~* _; H V - 'expire' => 1800, // 验证码过期时间(s)% k ? l4 _) Y6 X1 r
- 'useZh' => false, // 使用中文验证码
/ ^9 l- Y$ Z* Y$ ^9 [' b - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串8 B) v* n6 }' T! c" C9 }9 {% U
- 'useImgBg' => false, // 使用背景图片 $ z2 U$ T9 Z& L; ^5 D4 d
- 'fontSize' => 25, // 验证码字体大小(px)7 b( s" G. _- a
- 'useCurve' => false, // 是否画混淆曲线
# K- O. L: R) r - 'useNoise' => false, // 是否添加杂点 9 F# w5 N! e0 G
- 'imageH' => 0, // 验证码图片高度
8 D- R4 _2 i. | P8 j: Q: F - 'imageW' => 0, // 验证码图片宽度, U: w8 m. w" [4 |& l0 a
- 'length' => 5, // 验证码位数& l3 G: A& ^' M& _+ O
- 'fontttf' => '', // 验证码字体,不设置随机获取 w6 J+ L$ C4 Y, D9 v% ?
- 'bg' => array(243, 251, 254), // 背景颜色, X' l a1 R# q3 K; b1 k2 [" o& ~
- 'reset' => true, // 验证成功后是否重置
! c5 u- m3 S0 A+ n4 {0 {1 Z - );
复制代码 $ 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 |