|
首先在Home/Controller下创建一个公共控制器PublicController % A8 _6 Z& Q: d4 o# W( c& n
- <?php
8 ^- L2 X/ z1 |0 q# \0 _. \ - namespace Home\Controller;
7 c n; }1 X' s - 9 R6 z5 c: Z9 ?$ }" x6 X' ~0 L7 r
- use Think\Controller;
6 h& l& Y0 E6 q$ a- v: u+ W w - use Think\Verify;6 k# d* u2 x: O) O* |6 @
% Z. X" b$ A. ]7 o7 W* `- class PublicController extends Controller
; J2 y4 S) [1 \1 D* K9 M - {) Q5 a! w6 _: `7 W9 S; X% N3 p
) C1 M# L3 O. `: d$ ~+ ]2 n- /* 生成验证码 */, M5 A! _5 ` W3 s2 z$ i7 W' l. U
- public function verify()
8 F% e* k5 S; B, B! h3 Y C - {( {' r2 a" X! H# N
- $config = [
/ a( [4 L2 p9 W5 t1 d# a0 ` - 'fontSize' => 19, // 验证码字体大小
) Q1 `* _) f: t - 'length' => 4, // 验证码位数
! e3 H/ N+ V& Y - 'imageH' => 343 k8 n6 s) R! u7 Q5 n' r
- ];
1 I6 w0 p4 @5 U0 K- M5 ]1 d! a1 \ V - $Verify = new Verify($config);( p* t( n. [6 l7 ?& ~: r+ W
- $Verify->entry();
1 l$ W2 }# Y# f8 d8 o - }- d/ |8 q: f! O) l" a
. y; V# j6 O! T: E- /* 验证码校验 */
) `; g/ \+ e8 G, Y1 b - public function check_verify($code, $id = '')
4 Z: s/ N2 n; B - {
: `; \' N Q! \9 ? - $verify = new \Think\Verify(); w8 _1 B% I) L9 c8 x
- $res = $verify->check($code, $id);
0 o, v) \- f8 ~! ? - $this->ajaxReturn($res, 'json');
. K- D" V: t$ W+ Z6 z - }
, R+ u/ r6 `- x! G: h3 G - }
复制代码
; D) F5 P4 {: z, I, {, V, B
1 w* M9 x; K! p$ Sverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。" M+ [8 u% B% A- J9 F0 Y
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
7 C% @' A1 d% k前台模板页建立index.html
# w- {! p6 Z$ i) j- <div class="">
! V" i" O+ N6 f; H - <label for="j_verify" class="t">验证码:</label> <input id="j_verify"8 Q( @' L1 g9 \0 x
- name="j_verify" type="text" class="form-control x164 in">, G4 y' b3 P5 M- T' U9 y
- <img id="verify_img" alt="点击更换" title="点击更换"
' z a0 U, v+ a6 v - src="{:U('public/verify',array())}" class="m">* q/ u6 C" t6 H/ K# {( M1 G4 x
- </div>
复制代码
! }( X+ i+ Q! N0 S3 m使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {' v8 x* a9 G3 K* o, {
- var verifyURL = "public/verify";
+ R5 V! ]- d V3 E - var time = new Date().getTime();
. a5 W5 S- E# D: s: k9 v3 ] - $("#verify_img").attr({
) c1 f; p8 [2 T' E+ p. } t - "src" : verifyURL + "/" + time9 ]' \8 |5 f1 u6 j: l" l
- });
& ?& v8 w) T/ o$ p- _ - });
复制代码
N- I3 z6 B( w9 p5 D8 z: N8 t利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
0 i. {7 u6 X7 E# L& R% v- $("#j_verify").keyup(function() {& X0 n" n" u9 ^& \ F: u
- $.post("public/check_verify", {3 E; W- N. J: {
- code : $("#j_verify").val()- o* G2 `* ]& s- e) \$ N
- }, function(data) {
% q7 t7 @+ V- H% ^) S' P' k - if (data == true) {
# T+ C* z/ R; L - //验证码输入正确
# Y4 H5 ?4 X& ]9 o& C" w, N - } else {" N' X6 V! Q; f
- //验证码输入错误
5 Y/ Y N4 B* h$ w+ F K - }+ x5 O: H4 U/ A1 b, z8 L9 S
- });
. ?4 {& ~! n) `! q& q7 ] - });
复制代码 , C' G( J* t7 \9 n7 D/ O
利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(; v' c5 C. f$ q) ?
- 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥
% c$ R: [6 `" R1 r! y+ b- [ - 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合' i- A. A& R% ]2 p9 ]- A
- 'expire' => 1800, // 验证码过期时间(s)
- y( I1 j; H. n( G4 _ - 'useZh' => false, // 使用中文验证码
7 }* g( O0 \, \4 q - 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串+ N' c8 L5 i$ y* u
- 'useImgBg' => false, // 使用背景图片 ' K( \) r) x- \" g, s
- 'fontSize' => 25, // 验证码字体大小(px)
* m, B) x! l0 _: S4 O4 X - 'useCurve' => false, // 是否画混淆曲线# m0 c5 v, d2 Q9 [- P- {
- 'useNoise' => false, // 是否添加杂点
# i9 }& ^$ j1 s3 s/ C) B - 'imageH' => 0, // 验证码图片高度$ i( m; ~! V- |" g1 ]
- 'imageW' => 0, // 验证码图片宽度. |3 a1 U/ T. G4 D; v& a. o9 w" E7 n
- 'length' => 5, // 验证码位数 g& [/ D. M3 q* W8 N: E* C
- 'fontttf' => '', // 验证码字体,不设置随机获取
7 G% G$ F/ q6 U' _ h - 'bg' => array(243, 251, 254), // 背景颜色1 M1 u' j& r6 l# ~+ ?+ q, R
- 'reset' => true, // 验证成功后是否重置
. s* V. h0 V: K0 p. O - );
复制代码 & V' l& i5 `) k9 K! ^% i5 Z7 K) r
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
# V4 t5 s6 J' e& Z0 ~! J |