【发布时间】:2017-02-15 11:05:59
【问题描述】:
我想知道来自代码的标准 http 请求与通过提交 html 表单发送的请求之间有什么区别。当然会有明显的东西,比如用户代理等等。
我想向一个页面发送一个请求,该页面将创建一个会话变量。目前我有一个 PHP 脚本正在生成一个 HTTP 请求(我已经尝试使用 stream_context_create 的 curl 和 file_get_contents)到一个页面并拉回响应。这个相同的 PHP 页面也有一些 javascript 将使用 ajax 来生成完全相同的请求。
当 PHP 在没有 JS 的情况下创建请求时,会创建会话并在响应中返回,但是当我访问新页面时,会话已死。当我自己使用 ajax 时,请求会返回会话数据,而当我访问其他页面时,会话仍然存在。注意:我还尝试使用 html 表单并发布到 url,这也可以使会话保持活动状态。
我不知道为什么会这样。我唯一的想法是它可能是由 php 请求和 ajax 请求的默认值之间的一些差异引起的。
请求页面内容
session_start();
$_SESSION['message'] = "Works";
var_dump($_SESSION);
PHP脚本内容
<?php
session_start();
var_dump($_SESSION);
error_reporting(E_ALL|E_STRICT);
$username = "test";
$password = "test";
$url = "https://website.com/test.php";
$postinfo = "username=".$username."&password=".$password;
// $ch = curl_init($url);
// curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
// $result = curl_exec($ch);
// curl_close($ch);
$data = array('username' => $username, 'password' => $password);
$options = array(
'http' => array(
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
var_dump($result);
?>
<?php echo time();?>
<form action="<?php echo $url;?>" method="post">
<input type="text" name="username"><br>
<input type="text" name="password"><br>
<input type="submit" value="submit">
</form>
<script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
<script>
$( document ).ready(function() {
$.ajax({
type: "POST",
url: "<?php echo $url;?>",
data: { username: '<?php echo $username;?>', password: '<?php echo $password;?>' },
success: function (content) {
alert(content);
console.log("Request Response = " + content);
},
fail: function (message) {
alert("Failure - " + message);
editmemberform.dialog('close');
}
});
});
</script>
当我运行脚本时,我从 php 请求中得到的响应是
string(49) "array(1) { ["message"]=> string(5) "Works" } "
对我来说,这表明会话是在会话数据被转储时创建的。 ajax 请求然后发出请求并且响应是完全相同的。这是写入控制台的内容。
Request Response = array(1) {
["message"]=>
string(5) "Works"
}
我不明白为什么 2 个相同的请求会这样。我还尝试从 ASP.NET 脚本执行发布请求,并且我遇到了同样的问题。浏览器生成的请求与代码请求肯定有一些不同。
注意:我已经尝试过使用 http 和 https。我从来没有收到任何错误。响应总是正确的。
php 脚本在使用 PHP 5.4 的 IIS8 服务器上运行
【问题讨论】:
-
主要区别在于浏览器内部管理的会话 cookie,但您需要使用 cURL 管理自己
-
您没有保存会话 cookie,因此您的脚本发出的每个请求都将是一个新的/不同的会话。
-
如何定义默认会话 cookie?我希望能够创建登录会话数据,以便用户可以一次登录多个站点。代码请求需要在基于标准浏览器的会话中进行会话,这可能吗?
标签: php jquery ajax session server