我正在爲客戶的網站開發應用程序。 這是一個故事,這家公司使用名爲Synology的應用程序/ HDD,基本上它是一個連接到互聯網的硬盤盒,可以通過預先創建的帳戶訪問客戶端的文件。 這個接口是用CGI編寫的,我沒有訪問這個盒子(不同的網絡和位置)。幫助PHP,POST,COOKIE,JQUERY
我們想要做的是允許從主網站(我正在構建)的登錄表單繞過(至少對用戶:D)應用程序登錄表單。
我顯然不能對不同的域做一個jQuery ajax請求,它不會工作。所以我所做的就是
1)網站上的表格使用jQuery:
$("#login_submit").click(function(){
var username= $("input#login_username").val();
var passwd= $("input#login_passwd").val();
var post_string = "username=" + username + "&passwd=" + passwd ;
$.ajax({
type : "POST",
url: "login.php",
data : post_string,
success: function(response){
if (response){
$('.result').html("OK");
window.location = "http://XX.XX.net:5000/webman/index.cgi";
}
else {
$('.result').html("INVALID");
}
}
})
return false;
}
2)呼籲通過POST提交傳遞用戶和密碼的login.php頁面,PHP頁面使得向遠程Synology服務器發送HTTP POST請求,並在JSON中給我一個響應,顯然(?)我將其轉換爲PHP數組,以便我可以查看「成功」鍵是true還是false,如果爲true,jquery代碼將打印一個OK消息並重定向到遠程sylonogy服務器,我可以訪問我的數據記錄!
<?php
function do_post_request($url, $data, $optional_headers = null)
{
$params = array('http' => array(
'method' => 'POST',
'content' => $data
));
if ($optional_headers !== null) {
$params['http']['header'] = $optional_headers;
}
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if (!$fp) {
throw new Exception("Problem with $url, $php_errormsg");
}
$response = @stream_get_contents($fp);
if ($response === false) {
throw new Exception("Problem reading data from $url, $php_errormsg");
}
return $response;
}
if ($_SERVER['REQUEST_METHOD'] == "POST"){
$username = $_POST["username"];
$passwd = $_POST["passwd"];
$response =json_decode(do_post_request($url = "http://XX.XX.net:5000/webman/login.cgi", $data = "username=".$username."&passwd=".$passwd), true);
if($response["success"]){
$send = true;
}
else {
$send = false;
}
echo $send;
}
的這裏的問題是,login.cgi頁應該設定該服務器的會話cookie,但使用PHP請求它只是不會。它會給出響應,但不會將cookie設置爲瀏覽器。你有什麼想法,我可以做什麼來模仿POST瀏覽器請求,並設置cookie,同時保持jQuery的功能?也許我應該設置一些標題? 如果將一個簡單的表格作爲「動作」,那麼login.cgi 會話cookie是,但用戶當然會留在那個頁面上,我無法更改,因爲我無法訪問它。
您必須用四個空格縮進*每行*。 – Gumbo 2010-09-13 15:21:34