【发布时间】:2010-10-08 23:52:45
【问题描述】:
我有两个应用程序,一个是前端应用程序,另一个是后端应用程序。
每个应用程序都有自己的相同用户数据库副本。当用户登录前端应用程序时,我也会同时使用后端应用程序提供的 Web 服务登录后端应用程序。
现在的问题是我可以从前端应用程序中销毁后端会话吗?后端使用 $_Session 超级全局数组来存储所有会话信息。如果是,怎么做?
【问题讨论】:
我有两个应用程序,一个是前端应用程序,另一个是后端应用程序。
每个应用程序都有自己的相同用户数据库副本。当用户登录前端应用程序时,我也会同时使用后端应用程序提供的 Web 服务登录后端应用程序。
现在的问题是我可以从前端应用程序中销毁后端会话吗?后端使用 $_Session 超级全局数组来存储所有会话信息。如果是,怎么做?
【问题讨论】:
是的。
我假设您在正面和背面使用相同的会话 ID 名称。我认为默认是 PHP_SESSID。如果是这种情况,那么所有会话详细信息都将存储在一个位置。
我还假设前端和后端的域是相同的..如果它不同,那么它将无法工作,因为网络浏览器不会在不同域之间共享会话信息。
如果您对前端和后端使用不同的会话 ID 名称,那么您将不得不变得棘手。 (两者的会话 ID 都将在请求数据中,您只需加载两个会话并销毁它们。)
使用:
session_destroy();
【讨论】:
您需要从数据库或文件中删除会话记录(取决于您的系统配置)。
系统可能默认使用基于文件的会话,您可以使用session_save_path 确定目录。几乎可以肯定,使用存储在数据库中而不是文件系统中的会话要容易得多。
【讨论】:
如果您可以使用后端应用程序公开的 Web 服务来登录用户,为什么不能也使用它来登录用户呢?这样一来,一个应用程序就不必知道另一个应用程序是如何实现会话的(或者有特权可以在那里乱搞)。
如果这不可能,您必须按照 acrosman 的建议进行操作,并深入研究会话文件或数据库。
【讨论】:
您如何将前端会话与后端会话关联起来?如果保留前后端会话的会话名称(用作会话ID的唯一值)的映射,则可以轻松找到后端会话(可以保存在文件或数据库中),然后删除会话记录。 使用这一行来找出正在使用什么处理程序来存储会话文件:
$handler = init_get('session.save_handler');
您可以使用此行找出会话文件的存储位置:
$path = ini_get('session.save_path');
然后您可以删除会话文件或数据库记录。
您也可以创建一个Web服务方法来销毁后端会话,然后从前端调用它。
【讨论】:
如果这两个应用程序位于同一域的不同子域中,您可以保存一个 cookie,指示管理员应用程序用户已注销。然后让管理应用程序本身删除会话和“注销”cookie。
【讨论】: