PHPRPC 與其它 ajax 框架不同,PHPRPC 遵循的是“只做一件事,并把它做好”的原則。它只負責數據傳輸,并且將傳輸做到最好!它將你以前用傳統的 ajax 方式做不到或者很難做到的事情變得輕而易舉!
相信好多人選擇 PHPRPC 的一個主要原因就是它能夠讓你開發 ajax 應用變得更加容易!盡管 PHPRPC 的強大之處不僅限于此,但我不得不承認,這確實是 PHPRPC 的一大亮點!
所以,我們的第一站,就來看看如何用 PHPRPC 3.0 來編寫 ajax 應用吧。
下 面我們舉一個最簡單的例子(甚至可以算是無聊的例子 :mrgreen: )來說明如何使用 PHPRPC 3.0 編寫 ajax 應用。這個例子很好的說明了上面所提到的 MVC 模式如何具體的工作。這里我們先以 PHP 為服務器端的情況為例來說明。我們的第一個例子很簡單,客戶端輸入一段字符串,然后服務器端計算出它的 SHA1 值。
復制代碼代碼如下:
<?php
require_once("../php/phprpc_server.php");
$server = new PHPRPC_Server();
$server->add("sha1");
$server->start();
?>
只有這么簡單的 4 行代碼,就把 PHP 內置的 sha1 函數發布了。現在,客戶端可以直接使用這個函數了。
復制代碼代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>計算 SHA1</title>
<script type="text/javascript" src="../js/compressed/phprpc_client.js"></script>
<script type="text/javascript">
var rpc = new PHPRPC_Client('sha1.php', ['sha1']);
function $(id) {
return document.getElementById(id);
}
function showResult(result) {
$('sha1').value = result;
}
function sha1() {
var input = $('sha1').value;
$('sha1').value = "Loading...";
rpc.sha1(input, showResult);
}
</script>
</head>
<body>
<input type="text" id="sha1" />
<input type="button" value="計算 SHA1" onclick="sha1()" />
</body>
</html>
這個例子非常簡單,并且跟 PHPRPC 有關的只有兩條語句,一條是:
復制代碼代碼如下:
var rpc = new PHPRPC_Client('sha1.php', ['sha1']);
這條語句用來創建一個 PHPRPC_Client 對象,第一個參數是服務器地址,這里可以用相對路徑,也可以用絕對路徑。
而且這個路徑可以跨域!因此你可以做跨域的應用!
第二個參數是你需要使用的服務器端的函數名列表,所以,雖然我們這里只有一個函數,也要寫成數組的形式。這樣我們就有了一個可以調用服務器端方法的客戶端對象了。
那該如何調用呢?我們來看第二條關于 PHPRPC 的語句:
復制代碼代碼如下:
rpc.sha1(input, showResult);
這條語句相當簡單,你會發現我們直接使用了服務器端發布的函數名作為 rpc 對象的一個方法來調用。它的第一個參數就是 sha1 函數的參數值。第二個參數是個函數,這個是回調函數,也就是說,當服務器端方法執行完之后就會自動調用這個函數來完成結果的處理。它是在前面定義的,你會 發現它有一個參數 result,這個參數就是我們的遠程過程 sha1 的返回值,它是通過回調函數的這個參數傳入的。
另外一篇文章,整理的代碼比較詳細
昨天我舉了個用 PHPRPC 實現 Ajax 級聯下拉菜單 的例子,那個例子中我們重點要演示的是用 PHPRPC 實現 Ajax 效果是多么的簡單。今天我們這個例子主要演示用 PHPRPC 內置的安全加密機制來實現安全登錄是多么簡單。當然它同樣可以用于密碼設置、其它關鍵保密數據的傳輸等領域。
這個例子比昨天的例子還要簡單,先來看服務器端:
復制代碼代碼如下:
<?php
function login($username, $password) {
if (($username == "root") && ($password == "admin")) {
$_SESSION['user'] = "root";
return true;
}
$_SESSION['user'] = null;
return false;
}
require_once("phprpc_server.php");
new phprpc_server(array('login'));
?>
這段代碼太簡單了,我不需要多說什么大家也能夠看明白。不過大家會發現,在 login 函數中我用了 $_SESSION 變量,但是并沒有在什么位置上寫 session_start(),原因在于建立加密連接時,已經自動調用了 session_start(),因此不需要再單獨寫 session_start() 了。為了驗證它是否生效,我們在后面的另一個頁面中(admin.php),將判斷這里設置的 $_SESSION 變量,并根據它來報告登錄成功或者沒成功跳回到登錄頁面。
那再來看看客戶端,客戶端我們將 JavaScript 跟 HTML 分離了,先來看看 html 頁面。
復制代碼代碼如下:
<html>
<head>
<script type="text/javascript" src="phprpc_client.js"></script>
<script type="text/javascript" src="login.js"></script>
</head>
<body>
<div align="center">
帳號:<input type="text" id="username" />
密碼:<input type="password" id="password" />
<input type="button" value="登錄" id="loginbtn" />
</div>
</body>
</html>
這個頁面很簡單,只是設置好了表單輸入框和按鈕,所有的處理都是在 login.js 中完成的。不過需要注意的是這里的 phprpc_client.js 是 full 壓縮版本,因為我們需要用到它的加密傳輸功能。我們來看看 login.js 是怎么寫的。
復制代碼代碼如下:
// 創建 phprpc 客戶端對象 rpc
phprpc_client.create('rpc');
// 初始化帶有加密連接的 rpc 服務,第二個參數表示是否創建加密連接
rpc.use_service('rpc.php', true);
// 登錄函數
function login() {
// 如果加密連接已經初始化完畢,則驗證用戶名密碼
if (rpc.ready) {
// 獲取用戶輸入的用戶名和密碼
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
// 設置遠程過程調用為單向加密,
// 即傳遞的參數是加密的,但返回結果不加密
rpc.encrypt = 1;
// 調用遠程過程驗證用戶名密碼是否正確,并設置回調函數。
rpc.login(username, password, function (result) {
// 如果返回結果正確,則轉到登錄后的頁面
if (result === true) {
window.location.replace('admin.php');
}
// 否則提示用戶名密碼不正確
else {
alert('用戶名密碼不正確!');
}
});
}
// 如果連接尚未初始化完畢,則等待 100 毫秒后重試。
else {
window.setTimeout('login();', 100);
}
}
window.onload = function () {
document.getElementById('loginbtn').onclick = login;
}
大家會發現除了在調用 use_service 時,設置了第二個參數為 true 外,還在調用服務器端的 login 函數前,設置了 rpc.encrypt 的值為 1,這里 1 表示單向加密傳輸,單向加密傳輸是指調用的參數會以加密的方式傳給服務器,但是返回的結果不加密(如果參數是引用參數的話,參數返回時也是加密的)。如果 rpc.encrypt 的值為 0,則表示不加密;如果是 2,則表示雙向加密。
這里因為只有用戶名和密碼是敏感數據,需要保證它在傳遞給服務器時不被截獲(即使截獲也是加密的內容,無法破解),但返回的結果成功還是不成功并不是什么需要保密的數據,所以可以不加密。因此這里選擇了單向加密傳輸。
大家也不必擔心密鑰是否會被截獲,因為密鑰是通過密鑰交換算法,在服務器端和客戶端(瀏覽器端)隨機同步生成的,但沒有經過網絡傳輸,在網絡上傳輸的是生成同步密鑰的相關信息,但是只獲取到這些信息是不足以算出密鑰的,因此可以保證密鑰的安全性。而加密算法本身也是一個強加密算法,密鑰長度是 128 位,在沒有密鑰的情況下采用窮舉法也是無法破解的。
大家會發現登錄成功后,我們轉向了 admin.php 頁面,下面是這個頁面的一個簡單的例子:
復制代碼代碼如下:
<?php
session_start();
if ($_SESSION['user'] == 'root') {
echo "登錄成功!";
}
else {
header("Location: index.html");
}
?>
這里需要自己 sestion_start() 一下了,之后就可以驗證 $_SESSION['user'] 是否設置了。
通過 PHPRPC,你不再需要為 Ajax 程序中數據的安全性而頭痛,也不必為回話支持而苦惱,這一切 PHPRPC 都已經幫你自動完成了,你只需要關注具體的事務就可以了。用 PHPRPC 來做 Ajax 安全編程,就是這么簡單!