Php 我的代码如何知道客户端/浏览器是否已收到会话id?
创建会话并将数据存储到其中时,如果会话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”,该页面
$\u session
对象中显示不同的数据
例如:
$\u session[“status”]=“started”
$\u session[“status”]
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,我猜您必须检查会话数据文件是否仍然存在于会话保存路径下。)