是否可以检测是否在2个不同的浏览器中打开了一个页面?
我已经构建了一个小应用程序,它在$ _SESSION中存储了一些数据,问题是当多个选项卡被打开时,会话变量被覆盖(搜索过滤器中的搜索过滤器),因此选项卡可能会显示相同的搜索结果明显不同。
用于此应用程序的主浏览器是IE,因此需要一段时间才能解决此问题并且应用程序得到了更大更难修改。
在我修复所有对此搜索的引用之前,我想做一个“快速和彻底的修复”并拒绝打开同一页面的两个标签,或者至少显示警告..
编辑: @arjun:是的,我知道,但是当用户返回搜索页面时我必须恢复搜索过滤器:)所以$ SESSION就是这样做的。此外,过滤器由AJAX发送,当你有很多过滤器时很难调试(GET的大小有限,所以我使用POST)
@tomhaigh:thx ..但这就是我现在正在尝试做的事情,但这需要一段时间,因为这个标签“事物”会影响整个应用程序,我必须更改所有模块中的过滤器。 ..我现在正在寻找快速和肮脏的东西。提示:我不想使用time()和rand(),因为theese函数可以(并最终将)生成重复的数字。在新的“重写”中,我使用PHP中的microtime和JS中的Date.getTime()并连接theese 2以生成真正唯一的id。另外,我写了一个函数来不时地解析SESSION并清理存储过滤器超过2小时,所以它不会变得太大。
@Gortok:我知道..但是设计时考虑到了IE6,大多数用户(90%左右)在登录这个应用程序时仍然使用IE6 ...所以我从未看到需要考虑多个打开标签。答案 0 :(得分:6)
我建议避免使用$ _SESSION来存储搜索过滤器,而是将它们编码在搜索查询字符串中(例如/search.php?filter1=val&filter2=val等)。这样,每个窗口都有一个唯一的URL,并避免破坏另一个窗口。
答案 1 :(得分:1)
这是一个应该尽快修复的设计问题。尽管如此,快速而严格的处理方法是将客户端的IP地址存储在$ _SESSION($ip=$_SERVER['REMOTE_ADDR'];
)中然后检查并且不创建新会话或在发出多个请求时显示警告地址。这将导致通过LAN共享相同IP地址的访问者出现问题。我想不出更多......快速(或肮脏)
答案 2 :(得分:1)
我同意arjun的回答,但如果您必须使用会话,那么您可以在PHP会话中创建一个包含每个搜索信息的数组。
e.g。每次提交表格
$key = md5(rand(time(), 1));
if (!isset($_SESSION['search_filters'])) {
$_SESSION['search_filters'] = array();
}
$filters = & $_SESSION['search_filters'][$key];
//store stuff
$filters = array( 'something' => true );
然后你可以构造一个像results.php?key = $ key的url然后通过
检索数据$filters = &$_SESSION['search_filters'][$_GET['key']];
if (!isset($filters)) die('cannot find search');
//do stuff with data
print_r($filters);
你将遇到的一个问题是,当用户执行更多搜索时,会话将变得越来越大,我会再次使用arjun的答案,但我想我会添加另一种可能的方法
答案 3 :(得分:0)
永远不要拒绝用户的基本可用性。
答案 4 :(得分:0)
我看到两个问题:
您可能需要考虑将$_SESSION
变量更改为singleton,并且不允许多个网页浏览覆盖该变量。