Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
Http 在*发送响应后*保存/更新会话*是一种常见/良好的做法吗?_Http_Session - Fatal编程技术网

Http 在*发送响应后*保存/更新会话*是一种常见/良好的做法吗?

Http 在*发送响应后*保存/更新会话*是一种常见/良好的做法吗?,http,session,Http,Session,我在发送响应后开始更新会话,这似乎是一个提高速度的好方法,因为它现在是一个非阻塞任务 但我担心数据库中的最小速度降低可能会导致以这种方式更新会话时出现问题 假设我想为下一个请求设置一个会话闪存消息,但下一个请求/响应发生在会话更新之前。用户不会看到它,或者他会在另一个请求中看到它 最坏的情况是当您需要重新生成会话ID时。如果更新速度慢,而下一个请求的速度快于此,则用户将注销,因为他将请求一个不存在或已过期的会话(作为响应的一部分,他在cookie中收到了新的会话ID) 所以我想知道的是,这是否已

我在发送响应后开始更新会话,这似乎是一个提高速度的好方法,因为它现在是一个非阻塞任务

但我担心数据库中的最小速度降低可能会导致以这种方式更新会话时出现问题

假设我想为下一个请求设置一个会话闪存消息,但下一个请求/响应发生在会话更新之前。用户不会看到它,或者他会在另一个请求中看到它

最坏的情况是当您需要重新生成会话ID时。如果更新速度慢,而下一个请求的速度快于此,则用户将注销,因为他将请求一个不存在或已过期的会话(作为响应的一部分,他在cookie中收到了新的会话ID)


所以我想知道的是,这是否已经被研究过,人们是否正在使用它,我应该什么时候做,什么时候不应该做,是否有修复程序,等等。

如果你已经发送了一些输出,你就不能重新生成会话id。正如您所说,他需要在cookie中接收新的_id,这是必须首先发送的http头的一部分。如果用户有多个具有相同会话id的请求,并且您更改了会话id,则重新生成会话id可能会导致您提到的问题。例如,html页面和一些非常常见的图像。如果需要重新生成会话id,则应在没有其他资源需要该会话的页面中“单独”执行,以使其成为原子操作

现在我不确定您使用的是哪种语言,但例如php会在内存中收集会话信息,并在进程结束时将其持久化。因此,使这个非阻塞

的确,如果会话信息必须通过多个进程进行同步,则必须小心。然而,这在大多数网页/应用程序中并不常见。在这么短的时间内,您很少有多个请求(页面+资源下载之外)


基本上,在发送响应后更新会话信息通常是一个好主意。可以这样想:如果数据库速度慢,它可能很难提供过时的会话信息。所以不管怎么说,你写的东西很可能在那时就写完了(不?;)

这就是所谓的过早优化。除此之外,由于您在“优化”之前没有测量性能问题,因此您无法知道您是否使情况变得更糟。@JohnSaunders这是错误的,老实说,我已经厌倦了这种模因。首先,我从未说过这是一个虚构的应用程序,我是一个傻瓜。但即使是这样,那又有什么错呢?我是一名程序员,不是商人,也不是代码猴子。在编程中,尽可能多地并行化任务是一件很重要的事情,事实上,有很多语言都致力于解决这个问题。即使你是一个代码猴子:你真的构建了最糟糕的应用程序,然后才开始考虑设计和良好实践吗?对不起,我不会那么做的。我是一名专业人士。专业的做法是构建满足最高优先级要求的应用程序,然后构建满足下一个最高优先级要求的应用程序,等等。自行决定您的“优化”比您的利益相关者要求的更重要是不专业的。挤出尽可能高的性能可能是一件有趣的事,可能对自我有利,但对利益相关者可能不利。@JohnSaunders正如我所说,我正在思考并试图解决一个编程问题,而不是试图交付一个产品,这样我的老板会拍拍我的背,CEO/所有者会变得更富有。编程/软件工程是一门相当新的学科,有很大的改进空间。所以现在你可以停止引用“优化”,好像我用了那个词,或者好像我没有做任何改进。利益相关者?什么?你属于项目管理,所以去管理一个项目吧。我将在这里解决编程问题,或者学习已经解决的问题。“良好实践”意味着工程,而不是艺术。工程学就是解决问题。这些通常是真实的问题,而不是想象中的问题。玩得开心。首先我创建一个新的会话ID。然后我将它添加到cookie中,并将其附加到响应中。然后我发送响应,当它通过线路传输时,我将会话ID保存到数据库中。我的问题是,新请求可能与旧cookie一起出现,因为它们是在新cookie响应到达之前发送的。语言并不重要,我更感兴趣的是问题,解决方案是否存在,以及它是如何工作的。你似乎明白这一点,我只是想澄清一下。我担心的是ajax请求,有时它们会失控。我可以隔离重新生成ID的部分(例如:在登录期间),但是如果用户打开了其他选项卡,这些选项卡会定期发出ajax请求呢?如果是在登录期间,用户可能不会让其他选项卡在您的站点上执行ajax调用(他没有登录!)。但是,如果你每1000次调用一次SeaSudioID,你就有机会在页面加载的中间(附带所有资源)登陆,这很容易引起你所讨论的问题。我的建议是,如果可能的话,尽量只在“页面”上重新生成您的id。还可以让您使用ajax调用句柄302,这样它会随着超时时间的增加而重试(我假设一个未登录的请求被重定向(302)到登录页面)很多ajax请求不需要您登录,例如:股票价格。它们甚至可能出现在主页上。我想也许我可以在会话cookie中设置一个特定的路径,例如:/users。这样,当向家庭发出请求时,将不会发送cookie。但这将导致非常僵化的路线。这是我最近在这个话题上遇到的一些问题,请注意会话