curl调用后未保存PHP会话

数字堡垒

我需要通过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”],它在会话数组中不存在。

如何保留两个页面之间的会话?

谢谢

埃文·德拉克鲁兹(Evan de la Cruz)

问题在于客户端无法记住/传输PHP会话ID。

当HTTP客户端(通过HTTP服务器)向php脚本发出请求时,如果它希望继续先前启动的会话,则必须在请求中包含会话ID。可以在HTTP标头中以cookie或URL参数(默认情况下命名为PHPSESSID)完成此操作。如果您不想使用PHP的默认会话变量名称,或者您想使用POST变量而不是URL参数,则可以使用所需的任何请求变量或URL参数(无论是GET,POST还是COOKIE ),但是您将需要在服务器端手动解释此变量。

以下是三种解决方案,按照推荐程度从高到低的顺序排列。

  1. 在cUrl中打开cookie支持
  2. 将会话ID作为URL参数传递,
  3. 将会话ID作为请求变量(post / cookie)或不使用PHP期望名称的URL参数传递,然后使用该会话ID在服务器端手动启动会话。

解决方案1:在cUrl中打开cookie支持

每当您从该客户端发出请求时,PHP都会使用cookie中的会话ID重新加载您的会话数据。

在这种情况下,客户端是cUrl。您需要设置您的cUrl请求以允许/使用cookie。这可以通过设置CURLOPT_COOKIEJARCURLOPT_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);

使用$ cookieFile进行CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE的任何后续cUrl调用将具有与先前调用相同的会话数据。

解决方案#2:使用预期的参数名称(默认情况下为PHPSESSID,但可以更改)在URL查询字符串中传递会话ID。

您可以像这样将会话ID附加到所有URL:somepage.php?PHPSESSID = sessionidgoeshere

“ PHPSESSID”是PHP默认使用的变量名。如果服务器设置为使用非默认名称,则需要使用该变量名称。

使用解决方案2,您仍然需要以某种方式将会话ID存储在客户端。

解决方案#3:将会话ID作为请求变量或URL参数传递,然后使用该会话ID在服务器端手动启动会话。

在正常情况下,不建议使用此解决方案。与以前的解决方案不同,此解决方案需要更改服务器端脚本和客户端(cUrl)。仅当您特别希望将会话ID作为URL参数或Cookie以外的其他内容发送,或者要使用服务器期望使用的变量名以外的其他变量名时,此解决方案才有用。在开始会话之前,以下代码放入正在处理请求的服务器端PHP中session_id($_POST[<param_name>]);session_id($_GET[<param_name>]);session_id($_COOKIE[<param_name>]);


我建议使用解决方案#1,除非您有令人信服的理由不这样做。


同样,PHP不在乎请求是GET还是POST或任何其他HTTP请求方法。无论使用哪种HTTP请求方法,如果将会话ID作为URL参数或在cookie中传递,则相关会话将在服务器端保留。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章