会话过期时如何关闭弹出窗口

3
这是个问题:我的Web应用有很多弹出窗口,我的老板希望在会话过期时关闭它们,因为当会话过期并且用户在弹出窗口上按下刷新按钮时,他将被显示登录页面 -> 用户登录 -> 用户被引导到仪表盘。现在,在弹出窗口中的仪表盘屏幕完全不酷。这就是谷歌给我的地方:
如果会话已过期(从JSP检查会话过期并有条件地包含onload脚本),则生成此onload脚本以关闭弹出窗口的JavaScript响应。
你认为这是一个好方法吗?对于这种情况,最佳实践是什么?
注:我不允许使用AJAX。

2
最佳实践是不要使用“大量弹出窗口”。除此之外,当你在“onload”事件中谈论关闭弹出窗口时,真正会发生的是用户会刷新弹出窗口并关闭它(这对用户来说真的很奇怪),或者用户会从浏览器得到一个提示(关闭此窗口?是/否),这同样很奇怪。 - ChssPly76
@ChssPly76 - 是的,从用户的角度来看,这可能很奇怪。但是,设计面向数据的应用程序而不使用弹出窗口是一个非常大的挑战。 - Jay
只要弹出窗口不包含我需要的信息,我对它们感到满意。如果需要,而弹出窗口却没有相关信息,我会对设计师感到不满并咒骂他们。 - geowa4
1
使用弹出窗口的唯一可能的借口是应用程序需要在没有JavaScript的情况下运行,因为这样你至少可以通过<a href='...' target='...'来进行一些操作。除此之外,你可以通过javascript窗口、部分内容更新等方式完成弹出窗口所能实现的一切功能。我完全可以理解“不允许使用AJAX”会对这种方法造成限制,所以我并不是在批评你的设计选择,只是觉得“没有弹出窗口的设计是一种挑战”的说法完全荒谬无比 :-) - ChssPly76
5个回答

1
如果你的老板要求你在不使用AJAX的情况下实现这个功能,那么你会遇到麻烦。他应该明白,浏览器与服务器之间(不刷新页面)唯一的连接是JavaScript(他所理解的Ajax)。
最好的方法是在页面上设置一个脚本,每30秒左右向服务器询问用户是否仍然登录。
setInterval(function(){
  $.get("loggedin.php", function(result) {
    if (!result.isLoggedIn)
      window.close();
  });
}, 30000);

这个脚本假设您正在使用jQuery框架来快速开发JavaScript解决方案。它还使用JSON(JavaScript对象表示法)来测试从loggedin.php文件返回的值。

底线是,您需要使用AJAX。告诉你的老板没有其他办法。如果他仍然不明白,请让他试着在不使用数学的情况下平衡支票簿。


2
或者你可以告诉你的老板,你很聪明,找到了一种用Javascript而不是AJAX来完成它的方法。 - John Meagher
1
好的,AJAX中的J代表JavaScript。如果它不是异步(A)和不是基于XML(X),那么他可以说他没有使用AJAX,不幸的是,这个例子使用了JQuery,在幕后,它使用了AJAX的A、J和X。 - Ryan Fernandes

1

最好的方法是使用XMLHTTP请求来检查登录状态,如果需要的话就关闭它们 - 定期执行此操作。

敏锐的读者(也就是每个人)会注意到这是一个AJAX请求,但如果你这样说,那么可能会被接受,因为那些规定你“不允许使用AJAX”的人显然是白痴。


@Luke 非IT核心公司的企业IT团队里充斥着一群傻瓜,他们会告诉你不要使用AJAX :-) :而我的老板就是其中之一! - Jay
4
定期发送HTTP请求不会保持会话活动吗? - matt b
如果他们被发现了,那么他们就完了。如果你的老板看到你刚刚称呼他为白痴,那么你也一样完蛋了... - geowa4
1
@matt b:如果你记录了上一个用户的活动,就不会有这种情况发生。 - geowa4
@matt b - George说了我想说的 :) - Luke Schafer

1
在以前的生活中,我创建了一个弹出窗口管理器对象来维护哪些窗口是打开的。如果你还没有做过的话,你应该创建一个。然后,你可以使用setTimeout在若干分钟(或任何你想要的时间)之后调用一个函数。这将通过 AJAX 检查最近的活动并关闭弹出窗口,如果你确定会话已过期。如果没有过期,再次使用适当调整了最近活动的新时间调用setTimeout

^^ 在 AJAX 编辑之前。

好吧,既然你不能使用 AJAX,能否在 URL 中放置一些内容来告诉你它是一个弹出窗口?然后当用户点击重新加载时,你就知道不要显示登录界面。


1

在Web应用程序中实现模态对话框的另一种方法是:

  1. 在DIV中建模对话框,默认样式为display:none;
  2. 在所需操作时,将Modal对话框DIV注入/附加到页面源中
  3. 重置CSS显示,使模态对话框DIV可见,通过设置CSS z-index属性覆盖在页面上
  4. 使模态对话框在成功执行或用户取消后消失

由于模态对话框是页面源的一部分,当会话超时时,对话框将消失。这种方法不会产生支持窗口,因为发布者正在尝试解决的问题。它符合不使用AJAX的要求。

您可以手动编写这些代码,但我并不真正推荐这样做,因为需要支持各种浏览器。我建议查看Yahoo用户界面。您可以根据需要进行定制(例如:仅限模态对话框),如果要求发生变化,它还支持AJAX。

注意不要从模态对话框中生成模态对话框。


0

理论上,您可以通过使用隐藏的 Flash 小部件来避免 AJAX...

但更实际的做法是使用 AJAX,我认为您需要与您的老板交谈,确定这个“不使用 AJAX”规则的来源,并说服他 AJAX 是解决这个问题的最佳方式。

他是否认为实现 AJAX 会花费太多时间?如果是这样,您应该证明他是错的。他是否认为维护它将很困难?如果是这样,展示实现它的代码是多么简单,以及常用的 AJAX 库的广泛使用程度。如果您的老板是个理性的人,那么他的目标是为产品做最好的事情,您应该能够和他讲道理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接