Dig*_*ess 1 php session curl session-variables
我需要通过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);
Run Code Online (Sandbox Code Playgroud)
signin.php对api进行另一个curl调用,我确保signin.php返回所有必需的信息,设置所有必需的会话变量,返回一个数组:
echo json_encode(array(
'success' => true,
'ALLSESSION' => $_SESSION,
'error'=> ""
));
Run Code Online (Sandbox Code Playgroud)
ALLSESSION正在返回正确的会话变量,但它们不能直接访问,我的意思是我不能使用$ _SESSION ["userid"],它在会话数组中不存在.
如何保留2页之间的会话?
谢谢
问题是客户端没有记住/传输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);
Run Code Online (Sandbox Code Playgroud)
对CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE 使用$ cookieFile的任何后续cUrl调用将具有与先前调用相同的会话数据.
您可以将会话ID附加到所有网址,如下所示:somepage.php?PHPSESSID = sessionidgoeshere
"PHPSESSID"是PHP中默认使用的变量名称.如果服务器设置为使用非默认名称,则需要使用该变量名称.
使用解决方案#2,您仍然需要以某种方式在客户端存储会话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传递,则相关会话将在服务器端保留.
| 归档时间: |
|
| 查看次数: |
4296 次 |
| 最近记录: |