【问题标题】:What is the best way to protect user inputs (not yet submitted) from session timeout?保护用户输入(尚未提交)免受会话超时的最佳方法是什么?
【发布时间】:2008-10-31 00:45:24
【问题描述】:

我开发和维护小型 Intranet Web 应用程序(JSP 和 Resin)。

一些用户需要花费大量时间来完成表单, 当他们提交时,由于会话超时,他们丢失了所有输入数据。

目前我将会话超时时间延长到 30 分钟,并且 在页面顶部显示倒计时时钟,直到会话超时,但是, 我认为他们必须是更好的方法 保护用户输入。

最佳做法是什么?


附录 我们的用户使用网络应用程序制作多种报告, 并且每个报告的全部内容都存储在一个 JavaBean 中,该 JavaBean 存储在 session 中。

正如一些人所建议的那样,Ajax 或 iframe 应该可以快速修复。

我现在知道最好不要滥用重物会话, 但我不确定如何最好地重构当前的混乱。 有人建议让网络应用程序无状态。 欢迎提出任何重构建议。

【问题讨论】:

    标签: java web-applications


    【解决方案1】:

    您的框架可能会或可能不会出现这种情况,但我认为如果您的页面只是使用 AJAX 每五分钟(或其他任何时间)调用一次服务器,那么这将使您的用户会话保持活跃。您甚至不必以这种方式对表单进行部分保存。

    【讨论】:

    • 为什么这么可怕?它将使所有仍然打开浏览器窗口(即很有可能返回并希望继续)的用户保持连接,同时相当快地删除所有真正未使用的会话。
    • @trustyteen:会话超时是有原因的,这就是为什么理想的解决方案是从头开始编写应用程序以优雅地处理会话超时(即没有巨大的表单)。作为一种快速修复,AJAX-ping 方法使页面的安全性降低。增加会话超时将使所有页面减少。
    • FWIW,我不会在这里使用我自己的建议。如果网络应用程序用户经常因为会话超时而失去工作,则只需重写应用程序。
    【解决方案2】:

    在服务器端使您的应用程序无状态。您可以在隐藏的输入字段中包含您需要维护的任何状态。如果安全是一个问题,那么您可以在将数据放入现场之前对其进行加密。

    一个例子是在你的表单中加入这样的东西:

    <input type="hidden" name="user" value="bob" />
    <input type="hidden" name="currentRecordId" value="2345" />
    <input type="hidden" name="otherStuff" value="whocares" />
    

    这样做的主要优点是您的网络应用程序可以仅使用该页面完成所需的一切。它不需要任何会话变量,因为它需要的一切都在它刚刚收到的页面中。现在,它们需要多长时间并不重要,因为没有会话可以过期。

    第二个优点是它减少了服务器上的负载,因为它不会定期轮询您的用户。

    【讨论】:

    • 有无数优点,不需要跨服务器的会话复制,因此负载平衡变得轻而易举(客户端不必绑定到任何服务器实例)。大容量网络应用程序应该是无状态的。如果你的应用已经充满了会话依赖,那么重构就不是那么容易了。
    • @Jere.Jones 和@Lee Kowalkowski。您能否提供学习无状态网络应用的链接?
    • 我没有任何链接。对不起。这只是我使用的一个想法。我什至不确定这是一个“真实的”模式。 :)
    • @ulm:嗯,如果 Web 应用程序的目标之一是 RESTful (en.wikipedia.org/wiki/REST),那么在架构上会有所帮助。以我的经验,作为完成申请的事后考虑,我不会对此感到满意。因为您的 URI 需要大量的深思熟虑。
    • @Lee Kowalkowski:感谢您提供的信息。正如您所指出的,重写非 REST 应用程序并使其成为 RESTful 似乎是一项艰巨的任务。 @Jere.Jones:感谢您的回答。如果你能发表你的想法,那将是一本有趣的书。
    【解决方案3】:

    我只是最近才需要研究这个问题的解决方案。

    看起来最有希望的方向是使用 AJAX 定期检查数据是否输入,并将其发送到服务器。如果贵公司运行的浏览器支持 AJAX,这是一种可能。

    另一种可能的解决方案是将表单拆分,以便每个部分都足够小,可以在会话超时内填写和提交。

    【讨论】:

    • 除非他们仍在运行 Windows 95,否则我很确定他们的浏览器将支持 AJAX。
    • @amdfan 一些公司强制在他们的政策中禁用 javascrit(这对安全来说是一件好事)
    【解决方案4】:

    如果您正在为有限数量的用户(例如,公司内部网)创建应用程序,并且您不希望人们必须整天保持登录或让他们在长时间坐着时丢失输入信息时间,您可以只为浏览器打开到您的网站的人无限期地保持会话打开,而无需将会话超时设置为不过期。一旦他们关闭网站,会话就会正常过期。

    您需要做的是在页面的某处添加一个隐藏的 iframe。让 iframe 指向一个由应用服务器提供的简单 html 文档,其中包含一个元标记,每 29 分钟刷新一次(对于 30 分钟后到期的会话)。这样,只要该人打开您的网页,他们的会话就不会过期。但是,当他们离开您的网站时,它将照常过期。您可以获得无限的会话长度,而不会出现会话失控的不利影响。

    我在之前工作的企业环境中成功部署了这个解决方案。 Web 应用程序取代了旧的绿屏应用程序,例如,让他们去吃午饭并让应用程序在他们身上过期是不可接受的。

    如果您需要更多示例,请告诉我。

    【讨论】:

    • 会话仍然有效,即使客户端上的 cookie 已消失。其他人仍然可以劫持他们的会话。
    • 感谢您的建议。我想我会尝试为报告输入表单添加一个隐藏的 iframe。 (报告浏览不值得费心。)
    【解决方案5】:

    我建议您寻找一种无状态的替代方案(不依赖会话属性的东西)来代替您正在做的事情。

    如果我们知道您依赖会话的确切目的,我们可能会提供更多帮助。

    【讨论】:

      【解决方案6】:

      您可以每隔一段时间将数据存储在 cookie 中,使用 Gears 作为临时存储(如果数据复杂或需要超过 4K 的存储空间)或使用 AJAX 每隔 n 秒将临时数据发送到服务器。

      【讨论】:

        【解决方案7】:

        嗯..

        如何向用户显示关于会话即将过期的提示 - 保存数据(比如 5 分钟前),以便他们可以保存数据。这样他们就知道他们必须保存什么,并且如果会话真的需要过期,如果他们没有响应,就会在之后完成。

        如果您想避免使用 AJAX 连续 ping 到服务器,这是一种替代方法。

        【讨论】:

        • 感谢您的建议。我已经实现了超时警报框,但是我们的用户在报告制作过程中经常被打断,所以在用户缺席时弹出警报并不是非常有用。
        【解决方案8】:

        不要使用会话对象。这是导致各种可用性问题的原因 - 正如您所发现的那样。

        这是我开发 Web 应用程序的黄金法则:不要使用会话。

        话虽如此,但要谨慎地使用它来完成其他方式无法完成的事情。

        【讨论】:

        • 嗨,您有任何公认的消息来源支持您的“黄金法则”吗?我发现这是一个值得深入研究的有趣话题。
        【解决方案9】:

        我将触发“在 Ajax 检查会话已过期后”用户必须再次登录的模式窗口中的弹出表单,此弹出覆盖将覆盖当前页面/表单。所以数据不会丢失。

        P.N 如果你有一个...在隐藏字段中更新会话令牌。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-09-23
          • 1970-01-01
          • 1970-01-01
          • 2015-08-13
          • 2020-09-26
          • 2019-07-25
          • 2011-03-19
          • 1970-01-01
          相关资源
          最近更新 更多