Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我的代码如何知道客户端/浏览器是否已收到会话id?_Php_Ajax_Session - Fatal编程技术网

Php 我的代码如何知道客户端/浏览器是否已收到会话id?

Php 我的代码如何知道客户端/浏览器是否已收到会话id?,php,ajax,session,Php,Ajax,Session,创建会话并将数据存储到其中时,如果会话id尚未返回到客户端,则客户端对服务器的多次调用将导致在$\u session对象中显示不同的数据 例如: 客户端使用ajax请求页面:“/very_slow.php” “very_slow.php”设置一个会话变量:$\u session[“status”]=“started” “very_slow.php”然后开始做一些需要30-40秒的事情 客户端使用ajax立即调用另一个页面:“/check\u session\u variable.php”,该页面

创建会话并将数据存储到其中时,如果会话id尚未返回到客户端,则客户端对服务器的多次调用将导致在
$\u session
对象中显示不同的数据

例如:

  • 客户端使用ajax请求页面:“/very_slow.php”
  • “very_slow.php”设置一个会话变量:
    $\u session[“status”]=“started”
  • “very_slow.php”然后开始做一些需要30-40秒的事情
  • 客户端使用ajax立即调用另一个页面:“/check\u session\u variable.php”,该页面检查
    $\u session[“status”]
  • 如果步骤2必须创建会话(
    session_start();
    ),但尚未返回到客户端,则步骤4将不会在
    $\u session[“status”]
    中看到新值

    因此,我需要能够检查客户端是否有会话id。我该怎么做


    检查
    session\u id()
    不起作用,因为如果有任何代码调用了
    session\u start()
    ,那么即使客户端还没有收到响应,我也会得到返回的值。

    在客户端使用ajax请求页面之前:“/very\u slow.php”客户端可能打开了一个包含一些HTML和Javascript的页面,这就产生了ajax请求。在那里开始会话。会话ID将作为HTTP头发送到客户端,并将由xhr在步骤1中使用。在客户端使用ajax请求页面之前,它将保证步骤1..4的会话cookie:“/very_slow.php”客户端可能打开了一个包含一些HTML和Javascript的页面,从而发出ajax请求。在那里开始会话。会话ID将作为HTTP头发送到客户端,并将由xhr在步骤1中使用。它将保证步骤1..4的会话cookie。

    为什么不在请求网站时创建会话?这总是发生在任何AJAX调用之前@马可尔卡,这是个好主意。我想我会的。很高兴我能帮助你:)为什么不在网站被请求时创建一个会话呢?这总是发生在任何AJAX调用之前@马可尔卡,这是个好主意。我想我会的。很高兴我能帮助你:)“它将保证步骤1..4的会话cookie”——只要客户接受cookie。否则,两个后续的AJAX请求仍将在服务器上分别启动一个新会话。将会话id直接提供给JS代码(将其放入JS变量中),然后在AJAX请求中显式地将其作为GET/POST参数提供,可以缓解这一问题。(通过增加潜在攻击向量的数量,请自行研究)非常有效的点,但是我宁愿拒绝步骤1中没有会话的请求,而不是使用请求参数。但是,在调用
    会话\u start
    之前必须进行该检查,因为如果该检查发现根本没有会话id,或者它得到了一个(可能是伪造的)会话id,并且没有会话数据,它将自动创建一个新的会话id。(因此,如果通过假会话ID是一个问题,我猜您必须检查会话数据文件是否仍然存在于会话保存路径下。)“它将保证步骤1..4的会话cookie”-只要客户端接受cookie。否则,两个后续的AJAX请求仍将在服务器上分别启动一个新会话。将会话id直接提供给JS代码(将其放入JS变量中),然后在AJAX请求中显式地将其作为GET/POST参数提供,可以缓解这一问题。(通过增加潜在攻击向量的数量,请自行研究)非常有效的点,但是我宁愿拒绝步骤1中没有会话的请求,而不是使用请求参数。但是,在调用
    会话\u start
    之前必须进行该检查,因为如果该检查发现根本没有会话id,或者它得到了一个(可能是伪造的)会话id,并且没有会话数据,它将自动创建一个新的会话id。(因此,如果需要考虑传递假会话ID,我猜您必须检查会话数据文件是否仍然存在于会话保存路径下。)