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
AJAX请求是否保留PHP会话信息?_Php_Ajax_Session - Fatal编程技术网

AJAX请求是否保留PHP会话信息?

AJAX请求是否保留PHP会话信息?,php,ajax,session,Php,Ajax,Session,如果我让一个用户登录到我的站点,将他的id存储在$\u SESSION中,然后从他的浏览器中单击“保存”按钮,该按钮将向服务器发出AJAX请求。他的$\u会话和cookie是否会保留在此请求中,我是否可以安全地依赖$\u会话中存在的id?如果AJAX请求的PHP文件具有会话启动()会话信息将被保留。(将请求放在同一个域中)您真正得到的是:cookie是否随AJAX请求一起发送到?假设AJAX请求是到同一个域(或者在cookie的域约束范围内),答案是肯定的。因此,返回到同一服务器的AJAX请求确

如果我让一个用户登录到我的站点,将他的id存储在
$\u SESSION
中,然后从他的浏览器中单击“保存”按钮,该按钮将向服务器发出AJAX请求。他的
$\u会话
和cookie是否会保留在此请求中,我是否可以安全地依赖
$\u会话
中存在的id?

如果AJAX请求的PHP文件具有
会话启动()
会话信息将被保留。(将请求放在同一个域中)

您真正得到的是:cookie是否随AJAX请求一起发送到?假设AJAX请求是到同一个域(或者在cookie的域约束范围内),答案是肯定的。因此,返回到同一服务器的AJAX请求确实保留了相同的会话信息(假设被调用的脚本按照希望访问会话信息的任何其他PHP脚本发出会话\u start()。

AJAX请求保留会话是非常重要的。最简单的例子是,当您尝试对管理面板执行AJAX请求时。当然,您将保护您向其发出请求的页面,而不会让没有管理员登录后获得的会话的其他人访问。 有道理吗?

答案是肯定的:

会话在服务器端维护。就服务器而言,AJAX请求和常规页面请求之间没有区别。它们都是HTTP请求,并且都以相同的方式在标头中包含cookie信息


从客户端,无论是常规请求还是AJAX请求,都会向服务器发送相同的cookie。Javascript代码不需要做任何特殊的事情,甚至不需要意识到这一点,它的工作原理与常规请求相同。

但有一件事需要注意,特别是在使用框架时,检查应用程序是否在请求之间重新生成会话id-任何显式依赖于会话id的操作都会遇到问题,尽管会话中的其余数据显然不会受到影响


如果应用程序正在像这样重新生成会话id,那么最终可能会出现这样的情况:ajax请求实际上会使请求页面中的会话id无效/替换。

框架就是这样做的,例如,如果您在Front Controller或boostrap脚本中初始化会话,您不必关心页面控制器或ajax控制器的初始化。PHP框架不是万能的,但它们可以做很多像这样有用的事情

嗯,不总是这样。使用cookies,你很好。但是“我可以安全地依赖当前的id吗?”这一问题促使我用一个重要的观点来扩展讨论(主要是供参考,因为本页的访问者数量似乎相当高)

PHP可以配置为通过URL重写而不是cookie来维护会话。((在接受ajax请求的所有服务器端页面中放置会话()身份验证:

if(require_once("auth.php")) {

//run json code

}

// do nothing otherwise

这是我做这件事的唯一方法。

我可能错了,但我认为甚至不可能将ajax请求发布到其他域(不包括子域)?您可能可以使用动态脚本技巧进行欺骗。但千万不要厌倦它。是的,不能向其他域发出ajax请求。但是,您可以在页面中动态插入一个标记,并将其src设置为与javascript相呼应的域外url。不能向其他域发出ajax请求。但是,您可以在php代码中创建一个代理。aj对代理的ax请求,对其他域的代理请求。请注意……ajax请求可以跨域进行,但只有在响应类型为jsonp的情况下。我一直都在这样做。事实上,这就是我忘记做的:-)关于有多少人禁用了会话cookie的可靠统计数据?(我找不到。仅在Javascript上:在美国/欧洲,这一比例似乎在2%左右,世界平均值约为1.2%。)URL上的会话ID是一种过时的做法。在今天的web上,任何人都不应该认为他们可以在禁用Cookie的情况下冲浪,并且仍然可以登录到他们拥有帐户的网站。如果您的某个访问者禁用了Cookie,则可以安全地假设:出于隐私原因,他们特别不想登录任何网站;或者b)他们是意外登录的,现在他们不能登录任何网站,不仅仅是你的网站。接下来:服务器可以在设置cookie时设置
HttpOnly
标志,这意味着您的Javascript将无法看到cookie。但是,cookie仍然会针对AJAX和常规页面请求发送,并继续完全相同的工作。您的Javascript在
document.cookie
中看不到它。如果打开PHP错误报告,您可以得到AJAX响应返回的会话错误。我最近在一个项目中间歇性地收到一个
警告:session\u write\u close():无法写入会话数据(用户)
错误,但只有在加载页面其余部分期间发生AJAX请求时才会发生。我正在使用MySQL数据库来处理会话数据,主页请求可能正在锁定该表,从而阻止AJAX请求访问该表。@ButtleButkus这听起来像是服务器端代码中的一个问题,如果您将其作为自己的问题提交,我相信人们会愿意提供帮助。您不应该仅仅因为正在使用MySQL进行会话而收到该错误,因为它不应该以错误导致失败的方式锁定。这可能是MySQL连接饱和的问题,或者其他一些不相关的问题。它发生在一台不稳定的机器上,所以MySQL连接应该饱和。如果我不能很快弄明白的话,我肯定会发一个问题。