Tạo Captcha
Minh họa:
Để tạo một đối tượng captcha mới, bạn cần chỉ ra đường dẫn đến thư mục chứa ảnh captcha (sẽ tự động được tạo), đường dẫn đến font dùng để vẽ và các tùy chọn vẽ (số từ, kích thước, mức độ nhiễu,…). Ví dụ phương thức sau sẽ tạo và trả về một đối tượng Zend_Captcha_Image có kèm thêm một thuộc tính url trỏ đến đường dẫn captcha để client có thể truy xuất trực tiếp đến đó.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <?php public function genCaptcha( $controller ){ $captcha = new Zend_Captcha_Image(); $captcha ->setImgDir(APPLICATION_PATH . "/public/images/auth/login/captcha/" ) ->setImgUrl( $controller ->view->baseUrl( "/public/images/auth/login/captcha/" )) ->setFont(APPLICATION_PATH . "/public/images/auth/login/ARIAL.TTF" ) ->setWordlen(4) ->setFontSize(12) ->setDotNoiseLevel(2) ->setLineNoiseLevel(2) ->setWidth(85) ->setHeight(30) ->generate(); $captcha ->url = $captcha ->getImgUrl(). $captcha ->getId(). $captcha ->getSuffix(); return $captcha ; } |
Tại view, bạn có thể hiển thị captcha bằng cách dùng phương thức Zend_Captcha_Image->render(Zend_View_Interface $view = null, $element = null);
1
| <?php echo $this ->captcha->render( $this ); ?> |
Ngoài ra, vì đã có url đến captcha, bạn có thể tạo thẻ img với html. Như vậy có thể bổ sung các thuộc tính khác cho thẻ dễ dàng.
1
| < img id = "captcha" src="<?php echo $this->captchaUrl; ?>"/> |
Cuối cùng, bạn cần lưu lại captchaid để dùng cho việc xác thực captcha. Ta sẽ đặt nó trong một thẻ hidden trong form. Khi post lên server, ta sẽ lấy được giá trị của nó cùng với captcha code:
1
| < input type = "hidden" id = "captchaid" name = "captchaid" value="<?php echo $this->captcha->getId() ?>" > |
Xác thực Captcha
Khi một captcha được tạo ra, thông tin của nó sẽ được lưu trong session với key có dạng “Zend_Session_Namespace_{captchaid}”. Ta sẽ lấy ra session này với lớp Zend_Session_Namespace và so sánh captcha code với thuộc tính $session->word.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| <?php class AuthController extends Zend_Controller_Action { // ... public function loginAction() { Zend_Layout::getMvcInstance()->setLayout( 'public' ); if ( $this ->_request->isPost()) { $data = $this ->_request->getPost(); if (isset( $_POST [ 'captchaid' ])){ $capId = trim( $_POST [ 'captchaid' ]); $capSession = new Zend_Session_Namespace( 'Zend_Form_Captcha_' . $capId ); if ( $_POST [ 'captchacode' ] == $capSession ->word) { // captcha code is correct // do something else such as checking username, password,... return ; } else $this ->view->msg = "Invalid captcha" ; } $this ->view->formdata = $data ; } $captcha = AuthController::genCaptcha( $this ); $this ->view->captcha = $captcha ; $this ->view->captchaUrl = $captcha ->url; } /** * * Generate new captcha * @param Zend_Controller_Action $controller * @var Zend_Captcha_Image */ public function genCaptcha( $controller ){ $module = $this ->getRequest()->getModuleName(); $captcha = new Zend_Captcha_Image(); $captcha ->setImgDir(APPLICATION_PATH . "/public/$module/images/auth/login/captcha/" ) ->setImgUrl( $controller ->view->baseUrl( "/public/$module/images/auth/login/captcha/" )) ->setFont(APPLICATION_PATH . "/public/$module/images/auth/login/ARIAL.TTF" ) ->setWordlen(4) ->setFontSize(12) ->setDotNoiseLevel(2) ->setLineNoiseLevel(2) ->setWidth(85) ->setHeight(30) ->generate(); $captcha ->url = $captcha ->getImgUrl(). $captcha ->getId(). $captcha ->getSuffix(); return $captcha ; } } |
Chức năng Refresh Captcha
Bổ sung thêm một action vào AuthController dùng để tạo ra captcha mới và trả về thông tin cho trình duyệt. Vì đây là action sử dụng riêng cho ajax, nên ta sẽ vô hiệu hóa layout và trả dữ liệu dạng json.
1
2
3
4
5
6
7
| public function refreshAction(){ $captcha = AuthController::genCaptcha( $this ); $data = array (); $data [ "id" ]= $captcha ->getId(); $data [ "url" ]= $captcha ->url; $this ->_helper->json( $data ); } |
Tại view, ta tạo một hàm javascript để và dùng ajax gọi đến action trên và thay đổi giá trị của captcha.
1
2
3
4
5
6
7
8
9
10
11
| function getCaptcha() { $.ajax({ url: "/admin/auth/refresh" , type: "POST" , success: function (data){ var src = data.url; $( "#captcha" ).attr( "src" ,src); $( "#captchaid" ).val(data.id); } }); } |
Comments[ 0 ]
Đăng nhận xét