|
首先在Home/Controller下创建一个公共控制器PublicController
5 b$ Y' C3 E3 t2 X( n& E0 @% `! l- <?php6 q& k1 u' Y8 o* w( t* o
- namespace Home\Controller;
% \7 g1 f7 S C0 o6 z, B; n7 j: ~
# s# W) m8 K% @9 p7 F: V) H$ Z/ I. k( z+ e- use Think\Controller;
7 L& F1 f b- Z, X1 v! y/ {4 k - use Think\Verify;0 {4 P+ T5 ]# x# B+ O% f' J
8 X5 }$ t# q* d0 `1 C- class PublicController extends Controller
' u) G. S" V0 { - {
0 E5 Q2 N' Y2 U
# ]. R6 E" f( d4 {% w3 G! r- C. k- /* 生成验证码 */6 c9 h/ {6 b, Z& h5 N6 O
- public function verify()- W3 w% g: z5 U3 ]. }; I1 @
- {
5 X' N3 a6 @4 o! J - $config = [
8 o) u9 r1 I7 S/ b5 {' i2 N - 'fontSize' => 19, // 验证码字体大小
% U7 w1 U% N3 h% V8 E0 w - 'length' => 4, // 验证码位数! g5 ~' C6 c% g4 Z5 O2 C+ w
- 'imageH' => 34
0 [5 R: I" R9 C2 Q - ];. r) z5 o: _3 d5 G
- $Verify = new Verify($config);
6 b( H u% I) S7 ~* O, S" @ - $Verify->entry();
9 ~ L; \, j* Z1 b - }+ T) r8 v$ t8 b3 d! C
3 X* Y8 K# M2 Q/ ~8 @$ E- /* 验证码校验 */
, N7 c" ?0 Y1 a( F) k - public function check_verify($code, $id = '')# u* j+ A3 j ^/ l" o J
- {# `; A7 ?$ r- M7 ]1 X& ]# W+ L
- $verify = new \Think\Verify();4 V/ c9 o. W& _( p) {. v1 f
- $res = $verify->check($code, $id);7 M7 i0 }4 \8 Q8 ]5 n7 b0 m1 g9 @
- $this->ajaxReturn($res, 'json');1 i# E' K) K& `9 q
- }
; U; p4 V+ {4 I N - }
复制代码 0 O1 q/ x" ]6 [+ ]# ]; G$ J) G
8 N7 V2 g( ?) tverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。
( M1 w3 U. q/ K4 Zcheck_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。" T* Q& x4 c, E3 y% v9 `6 f- s& {
前台模板页建立index.html" ? R+ ~2 r1 f
- <div class="">7 S! K3 l( S: ]' q S. O1 P A! N
- <label for="j_verify" class="t">验证码:</label> <input id="j_verify"8 D% K4 L9 E. e# N& F4 {: L' U8 x/ Q
- name="j_verify" type="text" class="form-control x164 in">. p& O8 m+ G( ?
- <img id="verify_img" alt="点击更换" title="点击更换"& Q3 K! m9 V) ^ [& [
- src="{:U('public/verify',array())}" class="m">8 `) L: U; \6 }9 e) _
- </div>
复制代码 & _* l9 h8 D8 ]" H. F. [+ `7 R$ c! v e
使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {
! @0 F u% W0 C V+ k" t$ q5 h' h - var verifyURL = "public/verify";
9 R* V: K# [- E; a - var time = new Date().getTime();
0 y: V4 E. s5 S; i2 X3 |; V+ u - $("#verify_img").attr({2 e7 W6 a+ k% l; T' J1 i- U
- "src" : verifyURL + "/" + time
$ `3 A6 _$ Q$ V h - });. M2 N6 f; U0 A9 D* M1 N% W3 s
- });
复制代码 $ K, X! Z$ v$ D* W; M2 Z7 ~4 n
利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
" E, c" ?* c5 x+ v2 F- $("#j_verify").keyup(function() {
, r" \' ]- Y+ j2 ]3 v7 @, ] - $.post("public/check_verify", {# c7 y8 Y# n+ ?- W4 C
- code : $("#j_verify").val(), L! R# R6 Y9 x- l! o% b- P, F
- }, function(data) {! C0 A8 V- k& U$ t7 n
- if (data == true) {
* S7 I* j/ M/ }& C - //验证码输入正确
$ ?% Y# J/ X0 Z9 g& \* Q) e' W% g - } else {* }8 b6 T! c& a1 O: a5 K) Y
- //验证码输入错误# i7 k1 ~" N& c( u0 O. e
- }
6 ?1 h: r4 J' z1 w- ^ - });
+ B% T! o, _5 }1 J0 l2 S4 Z - });
复制代码 - z2 ]& H1 h* P0 W5 ~
利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
4 a, ^2 A3 V' x5 B2 K - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥
9 F3 e% @% Q) T7 a* w9 E g. ] - 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合
& {5 J/ N( l0 r/ ?0 D! z - 'expire' => 1800, // 验证码过期时间(s)
! r1 U% G8 e3 ^& o7 a% _8 d0 U% [ - 'useZh' => false, // 使用中文验证码
3 |$ [; H+ Y* t. U% J# r - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串
# v+ C) x% g7 k7 e& y" H1 }9 p2 a - 'useImgBg' => false, // 使用背景图片
+ f: B* r7 m8 I0 M+ {: g - 'fontSize' => 25, // 验证码字体大小(px)
+ k6 p( o& k; U- { - 'useCurve' => false, // 是否画混淆曲线
1 t6 B! h8 j: L ^ - 'useNoise' => false, // 是否添加杂点 4 `, Z0 H2 }4 O* y
- 'imageH' => 0, // 验证码图片高度
2 x9 Z8 F0 v( m6 }6 }7 ] - 'imageW' => 0, // 验证码图片宽度$ ^9 N4 J5 c! K
- 'length' => 5, // 验证码位数
/ H F O* |: L" Z) o8 o1 I - 'fontttf' => '', // 验证码字体,不设置随机获取! Y- n$ w! d, N! e
- 'bg' => array(243, 251, 254), // 背景颜色
- C2 k9 k1 W, U+ {5 B, W& ?3 n* X - 'reset' => true, // 验证成功后是否重置2 H: g' B. _4 o& d# u$ N
- );
复制代码
8 x, I/ U3 S ~请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。 8 ?0 ?9 f& N7 i9 {
|