|
首先在Home/Controller下创建一个公共控制器PublicController
* q: Z- H3 X6 }: U7 A' F- <?php
' T& A) y* F" z - namespace Home\Controller;$ @& W7 ~' ~; S$ m0 g. [
, V: n" i4 ^( _4 S- use Think\Controller;+ G: t' ~' x5 L2 R
- use Think\Verify; ^- }! K5 S2 {8 ?+ Q3 s1 R6 O; C: ^: _
* P" F+ F9 k: r! s. O' J5 c- class PublicController extends Controller h6 h; n/ x+ v& G
- {& u, j" u7 I3 F9 t& L; W+ a
: i% T1 J/ M, g S2 e- /* 生成验证码 *// G) G9 G K t$ M Z" F
- public function verify()
3 q; b: C- z" [! U- r8 e6 W - {
( r+ K5 B1 j9 f3 g - $config = [
( I, K1 o6 e8 l) J+ { - 'fontSize' => 19, // 验证码字体大小3 o5 X$ I/ |" y) \# [
- 'length' => 4, // 验证码位数
8 j5 x: t6 o8 C. W, {* j - 'imageH' => 343 S) C; f1 Z0 t& c" l% D
- ];
; k0 Z- g" E- _ - $Verify = new Verify($config);% Y0 S7 p- R- a; [2 w9 K) X; N
- $Verify->entry();
& v6 U/ m0 F8 P" v1 B" [ - }1 W- r# W; x' C3 [
; O0 n! o+ k, A6 I- /* 验证码校验 */
6 ?. b n5 L& S0 T3 s6 c - public function check_verify($code, $id = '')
' i \6 k6 k% @ - {
4 J' y+ m- i |9 P9 ] - $verify = new \Think\Verify();& {/ m$ a- q! A
- $res = $verify->check($code, $id);5 Q$ [% h3 q p K# |9 V
- $this->ajaxReturn($res, 'json');
! p! [* o3 d/ J9 M- Y - }- K& E% N4 m4 m3 o$ H+ g1 U8 u
- }
复制代码 0 t2 J5 Z, R1 w
) @+ @% ^/ J- v9 k- p/ jverify函数用于生成验证码,config是用来配置显示验证码的属性。该属性有哪些可配置项,可以查看Thinkphp/Library/Think/Verify.class.php文件,此处不再赘述。) @9 N! U0 ~" @$ D7 r% k
check_verify函数用于校验验证码的正确性。模板post用户填写的验证码到该函数,返回$res==true验证通过false验证失败。
* ?% }& Q& @& l" X( P' N$ k前台模板页建立index.html
! e" }* \5 L9 i) {- <div class="">. ?# B# r" i( B( a L7 d
- <label for="j_verify" class="t">验证码:</label> <input id="j_verify"
7 U% e" i- C0 b) Z( h; K% K - name="j_verify" type="text" class="form-control x164 in">( Y0 M/ q w& f& t/ ^ X
- <img id="verify_img" alt="点击更换" title="点击更换"# U. T+ Y; m) K1 T
- src="{:U('public/verify',array())}" class="m">/ j1 n' i1 M; J; ^% z
- </div>
复制代码
; \% W2 p* U! `' x- Q) Z使用Thinkphp的U方法形成生成验证码的图片。 到此验证码即可正常显示。点击刷新验证码从上面产生验证码的链接我们可以看出,域名/public/verify即可产生验证码。Thinkphp的验证码生成机制是,如若我们需要产生新的验证码,在该链接后加入一个变量值即可。 我们可以考虑实现public/verify/变量值的形式URL。 - $("#verify_img").click(function() {8 o" ~& }' o3 P% |/ G7 s% B
- var verifyURL = "public/verify";
5 |% H; q6 N; j6 I: y - var time = new Date().getTime();/ P m% F7 b Y' g
- $("#verify_img").attr({
5 k, w3 s; p2 E% P - "src" : verifyURL + "/" + time) b& m8 ?4 M* V W$ S& P
- });7 q' Z; D" H+ ~$ }6 n) w. |
- });
复制代码
6 e9 {( r) X( }5 f- q+ h- |利用JS获取当前时间戳加入到URL之后即可。 到此我们即可实现验证码的点击刷新功能。具体表现形式,自己随意哈。 异步校验验证码大家一定见过在某些网站,我们输入验证码的时候,输入的过程中文本框后面一直显示错误,直到我们输入争取的时候会先提示验证码正确的形式。下面代码就可以实现:
7 R5 w e j y- $("#j_verify").keyup(function() {+ H) s0 N0 h5 r" g% i4 y6 R2 I
- $.post("public/check_verify", {
1 n; V! a) l5 J7 x) R - code : $("#j_verify").val()
/ g2 @* X$ x1 X: w - }, function(data) {+ E1 f2 K7 }4 U( J3 o
- if (data == true) {; I6 o3 @3 r' N
- //验证码输入正确# h7 ?* m3 `" R4 K
- } else {
8 {$ C2 M! J6 q - //验证码输入错误
1 `5 r. u# N% z) ?: ]; w* u4 Z - }
5 R$ k4 m% a+ D8 A0 z% j - });' E/ z; Q& z/ d( { t9 |* R
- });
复制代码
* ~9 g$ M/ T7 R/ e0 I+ v- V' k9 {利用onekeyup。原理就不需要多讲了吧! 这样我们就可以实现在提交用户名密码之前先进行一次验证码校验,之后表单提交之后再进行一次校验,提升用户体验啦! 还没结束:当我们采取以上形式实现验证码两次校验的时候,肯定会出现第一次异步校验成功,但是提交表单却提示验证码错误的情况!其实原因还是出在Thinkphp的Verify.class.php上: 以下是该类初始的config配置: - protected $config = array(
2 g" A( @" z0 G0 E+ X$ e - 'seKey' => 'ThinkPHP.CN', // 验证码加密密钥
8 k* a6 z% I; m - 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字符集合/ w1 G+ e2 Q% }) w) M% _8 c5 G
- 'expire' => 1800, // 验证码过期时间(s)3 o9 ~: G" }) [- J7 M' l/ x/ e
- 'useZh' => false, // 使用中文验证码 7 I: q' L) x j/ ~1 E) p
- 'zhSet' => '……此处不粘贴了,太多了!', // 中文验证码字符串3 d, x9 V9 j( T) N
- 'useImgBg' => false, // 使用背景图片
. Y6 j8 ]1 s: |* |- G - 'fontSize' => 25, // 验证码字体大小(px)
0 I \: Q) Q" ?- y" ^1 v: B+ d - 'useCurve' => false, // 是否画混淆曲线/ {5 B; O* B1 N1 ]$ a# _
- 'useNoise' => false, // 是否添加杂点
: o- A4 _' z7 B" W3 |" s - 'imageH' => 0, // 验证码图片高度" p; t( Z; w1 |+ r. j# H% f( E
- 'imageW' => 0, // 验证码图片宽度4 H) }4 V/ b& g5 B9 Q
- 'length' => 5, // 验证码位数( A# B* o. N+ H% X v
- 'fontttf' => '', // 验证码字体,不设置随机获取9 L: x V' g6 n( d, ?) ^
- 'bg' => array(243, 251, 254), // 背景颜色
4 Z( d0 x! S% m4 v5 f - 'reset' => true, // 验证成功后是否重置: x" s8 @" C7 g/ G; L
- );
复制代码 3 w6 `- K+ Z$ t$ ?
请大家注意最后一个属性reset 表示的是验证成功后是否重置验证码。相信大家都明白了吧,我们进行第一次校验通过之后,其实该验证码已经失效了,只不过因为我们采取的是异步校验,页面并没有刷新,导致了第二次申请校验的时候和系统产生的已经是不相同的了。所以如果大家喜欢这种两次校验的风格,可以考虑将reset配置为false即可。 好了,基于Thinkphp3.2.3的验证码问题今天就总结到这了。只是大概说了一下实现方法,具体内容还请大家参考TP官方手册。如有错误之处,欢迎大家指出。
# h) o, u* ]& Z |