代码与Web浏览器中的HTTP请求之间的差异

时间:2016-10-06 15:48:59

标签: php jquery ajax session server

我想知道代码中的标准http请求与通过提交html表单发送的请求之间是否存在任何差异。当然会有明显的事情,比如用户代理和什么不是。

我想向页面发送请求,页面将创建会话变量。目前我有一个PHP脚本,它正在生成一个HTTP请求(我已尝试使用stream_context_create的curl& file_get_contents)并撤回响应。这个相同的PHP页面也有一些javascript将使用ajax生成完全相同的请求。

当PHP在没有JS的情况下创建请求时,会话创建并在响应中返回,但是当我访问新页面时,会话已经死亡。当我自己使用ajax时,请求返回会话数据,当我访问其他页面时,会话仍然存在。注意:我也尝试使用html表单并发布到网址,这也可以使会话保持活跃状态​​。

我无法弄清楚为什么会这样。我唯一的想法是它可能是由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脚本执行post请求,并且我遇到了同样的问题。浏览器生成的请求必须与代码请求有所不同。

注意:我使用http和https试过这个。我从来没有得到任何错误。答案总是正确的。

php脚本使用PHP 5.4在IIS8服务器上运行

2 个答案:

答案 0 :(得分:1)

是的,实际上会有很多不同。

由于您通过代码请求的页面很可能是由人类在Web浏览器中浏览的,因此它将具有各种技术 - 主要是cookie和javascript。

您的PHP脚本将无法处理JavaScript(即:在浏览器中登陆页面5秒后,使用从远程服务器获取的值将<div></div>写入DOM - 你的PHP脚本不会得到这个),除非你使用无头浏览器 - 例如PhantomJS

  

当PHP在没有JS的情况下创建请求时,会话会在响应中创建并返回,但是当我访问新页面时,会话已经死亡。

您的PHP代码不会存储用于下次访问该网页的Cookie(在其当前设置下)。 cURL支持Cookiejar optionCURLOPT_COOKIESESSIONCURLOPT_COOKIEJAR)来发送之前请求的Cookie。

curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); 
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookie.txt"); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true);

有关详细信息,请参阅this comment on the manual

答案 1 :(得分:0)

  

当PHP在没有JS的情况下创建请求时,会在响应中创建并返回会话,但是当我访问新页面时,会话已经死了。

当PHP创建请求时,会话不会持久存储到您的浏览器中。

你可以尝试使用一些.js在你的浏览器上设置一个PHPSESSID cookie,其会话ID是通过你的PHP脚本创建的,以便自己查看! (虽然这可能是一个安全问题,但可能无法完美运行。)