我需要通过curl脚本验证我的用户
session_start();
$_POST["username"]= "user";
$_POST["password"]= "password";
$ch = curl_init();
$url = 'signin.php';
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($_POST));
curl_setopt($ch,CURLOPT_POSTFIELDS, $_POST);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$result = json_decode(curl_exec($ch),true);
curl_close($ch);
signin.php对api进行另一次curl调用,我确保signin.php返回所有必需的信息,设置所有必需的会话变量,返回一个数组:
echo json_encode(array(
'success' => true,
'ALLSESSION' => $_SESSION,
'error'=> ""
));
ALLSESSION正在返回正确的会话变量,但它们不能直接访问,我的意思是我不能使用$ _SESSION [" userid"],它在会话数组中不存在。
如何保留2页之间的会话?
由于
答案 0 :(得分:6)
问题是客户端没有记住/传输PHP会话ID。
当HTTP客户端向php脚本(通过HTTP服务器)发出请求时,如果希望继续之前启动的会话,则必须在请求中包含会话ID。这可以在HTTP标头中作为cookie或作为URL参数(默认情况下名为 PHPSESSID )来完成。 如果您不想使用PHP的默认会话变量名,或者您想使用POST变量而不是URL参数,那么您可以使用您希望的任何请求变量或URL参数(无论是GET,POST还是COOKIE) ),但是你需要在服务器端手动解释这个变量。
以下是三种解决方案,按照大多数建议的顺序推荐。
每次您从该客户端发出请求时,PHP都会使用Cookie中的会话ID重新加载会话数据。
在这种情况下,客户端是cUrl。您需要设置cUrl请求以允许/使用cookie。 这可以通过设置CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE选项来完成。
session_start();
$_POST["username"]= "user";
$_POST["password"]= "password";
$ch = curl_init();
$url = 'signin.php';
//Name of a file to store cookie data in.
//If the file does not exist, it will be created.
//cUrl (or your web server) needs to have write permissions to the folder.
$cookieFile = "/some/writable/folder/filename";
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($_POST));
curl_setopt($ch,CURLOPT_POSTFIELDS, $_POST);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
//Tell cUrl about the cookie file
curl_setopt($ch,CURLOPT_COOKIEJAR, $cookieFile); //tell cUrl where to write cookie data
curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile); //tell cUrl where to read cookie data from
$result = json_decode(curl_exec($ch),true);
curl_close($ch);
对CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE使用 $ cookieFile 的任何后续cUrl调用将具有与先前调用相同的会话数据。
您可以将会话ID附加到所有网址,如下所示: somepage.php?PHPSESSID = sessionidgoeshere
“PHPSESSID”是PHP中默认使用的变量名称。如果服务器是setup to use a non-default name,那么您需要使用该变量名称。
使用解决方案#2,您仍然需要以某种方式在会话端存储会话ID。
不建议在正常情况下使用此解决方案。与以前的解决方案不同,此解决方案需要更改服务器端脚本以及客户端(cUrl)。此解决方案仅在您特别希望将会话ID发送为URL参数或cookie之外的其他内容时,或者如果您要使用服务器所期望的名称以外的变量名称时才有用。
放置following code in your server-side PHP that is handling the request, prior to starting the session:
session_id($_POST[<param_name>]);
或session_id($_GET[<param_name>]);
或session_id($_COOKIE[<param_name>]);
我建议使用解决方案#1,除非你有令人信服的理由不这样做。
此外,PHP不关心请求是GET还是POST或任何其他HTTP请求方法。无论HTTP请求方法如何,如果会话ID为passed as a URL parameter or in a cookie,则相关会话将在服务器端持续存在。