|
首先在Home/Controller下创建一个公共控制器PublicController ( ?1 L- T5 P5 Z- X
- <?php
: L. c, d5 @" P" Z - namespace Home\Controller;+ ^& T8 R+ T4 w; n
0 A3 q! @! [6 u+ Q. i% Y- use Think\Controller;7 D: R; g- N# J7 \: R6 \4 |
- use Think\Verify;% ~0 g& d+ z3 ~* P( o5 [1 q
- ( n; \( @3 z9 H6 Q* w7 D) D: `
- class PublicController extends Controller. k4 q9 n* W/ W3 C" a& M& E
- { i& O- C9 C. S5 k( J* ?
- 5 O+ g& B3 r7 \ _
- /* 生成验证码 */
3 o+ H2 q- l0 }* R. U! V - public function verify()/ o% h1 B9 D3 @: v/ e+ a$ U2 g% Z
- {
+ p0 L! B x+ l* R/ Z1 F# I - $config = [+ q$ T ^8 x: r
- 'fontSize' => 19, // 验证码字体大小
T! e! \8 C# p9 ~4 S4 _ - 'length' => 4, // 验证码位数
8 C: a* j) B8 {, c. w- @: ~& T! N' Q - 'imageH' => 34
5 \ T9 r9 N) ?( W2 d - ];
' X. f+ d! N: G" B$ m0 S- Q' X: P2 [ - $Verify = new Verify($config);5 d' J7 P8 ]0 M' n
- $Verify->entry();" L% n6 N+ n+ b- S6 P
- }
( S/ W, \ I. ?% l" Q - 9 e! c; v) Q1 _2 M
- /* 验证码校验 */8 a( U$ }* U1 w% V3 B1 R( i: [. f
- public function check_verify($code, $id = '')0 e3 s2 [3 P+ p3 S8 P* m) `/ H5 }
- {
, }4 S4 F; B; L; u8 D+ Y7 C - $verify = new \Think\Verify();
1 D5 z- B% b$ a$ j& v - $res = $verify->check($code, $id);
3 f) r' Q4 U6 t$ u1 [ - $this->ajaxReturn($res, 'json');/ W" X) b' @0 |
- }
- o$ d7 R/ p. [5 X: C1 U* O# {6 _ - }
复制代码
h5 ]6 _( B4 r1 V) |2 k8 n6 @5 }
verify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。2 t) K2 F8 K0 ~$ I
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
* o- U( u. ~5 v, d+ g6 m7 ?" y前台模板页建立index.html
- ]# @$ S6 R! ~ p4 C- <div class="">+ S7 `$ m8 o" w$ V* N @% T
- <label for="j_verify" class="t">验证码:</label> <input id="j_verify"5 Z% |! Y1 l" X7 P: A( s8 |
- name="j_verify" type="text" class="form-control x164 in">
! {% O# D( G% z/ Q J - <img id="verify_img" alt="点击更换" title="点击更换"
5 j5 M% V1 f- ^3 } Z9 q - src="{:U('public/verify',array())}" class="m"> ]6 M: C& q; Y- @$ z
- </div>
复制代码 " H3 a$ b3 \( w
使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {6 K, g- V9 |9 `% ]! z2 U
- var verifyURL = "public/verify";
6 H4 q2 Q9 W3 S; C - var time = new Date().getTime();5 x- w* e* s* h. {' I) \
- $("#verify_img").attr({
' h9 i! q5 N: J# N$ l - "src" : verifyURL + "/" + time; _9 g/ Q" N. {4 Y7 z: [# v
- });2 p" m2 `% a$ G# u T
- });
复制代码 O! i% A0 ~4 z7 t( Y* a& r
利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
2 g# F2 Y# H* e% T- $("#j_verify").keyup(function() {
4 f% c4 z, m3 S' V' o - $.post("public/check_verify", {
. a! z+ ?9 W2 v" }- Z" _9 y - code : $("#j_verify").val()3 W" N( A" _) \3 o$ u
- }, function(data) {
5 _" r# d& x; e* s1 j+ G/ q - if (data == true) {4 L9 f" e8 D% p, c; r
- //验证码输入正确
: p5 p( G/ ~! L0 D% H: T - } else {" J4 a; {0 J5 R! t% K/ L8 A7 X
- //验证码输入错误
1 \2 p' K, b4 h- N - }
R* P7 m2 i# S0 _- ?% v: p4 o/ |; J1 f - });5 B$ J8 e; o( L, Y+ S2 I" o
- });
复制代码 % T0 G5 Z3 o) z% I$ w* V
利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
7 R% N& u& \, H4 M7 j( F3 C5 N* ` - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥3 ]+ o, U0 T1 C2 H" o U7 W3 i
- 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合$ g' J9 Q l. `" I* ^
- 'expire' => 1800, // 验证码过期时间(s)
7 a# l' T O y4 g% ?1 p - 'useZh' => false, // 使用中文验证码 ) m, z, H; O* \
- 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串
* G% _5 p! h4 e% |# v9 u - 'useImgBg' => false, // 使用背景图片 + G. [6 u( V+ ~$ J' \
- 'fontSize' => 25, // 验证码字体大小(px)7 ]0 q0 Q) ^1 f
- 'useCurve' => false, // 是否画混淆曲线8 ?% V$ @' K6 N |* u2 g
- 'useNoise' => false, // 是否添加杂点 : Z+ P. y: w" ]
- 'imageH' => 0, // 验证码图片高度
3 |/ M' P7 M0 T2 v+ ~! } - 'imageW' => 0, // 验证码图片宽度
" O" l. Y- V% o* p2 u4 V - 'length' => 5, // 验证码位数
$ T" p Z7 y v2 d0 u - 'fontttf' => '', // 验证码字体,不设置随机获取
- D7 T; D0 h* s - 'bg' => array(243, 251, 254), // 背景颜色' M! @" M" z; t/ A/ b _
- 'reset' => true, // 验证成功后是否重置" A3 i* R- H: f$ g
- );
复制代码 $ ^% v* D$ T9 x b, s5 T
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
|! c5 _- m, O8 L8 A |