我开发和维护小型Intranet Web应用程序(JSP和Resin)。
有些用户花了很多时间来填写表单, 当他们提交时,由于会话超时,他们会丢失所有输入数据。
目前我将会话超时延长至30分钟 在页面顶部显示倒计时时钟直到会话超时,但是, 我认为他们必须有更好的方法 保护用户输入。
最佳做法是什么?
附录 我们的用户使用网络应用程序制作了几种报告, 并且每个报告的全部内容都存储在会话中存储的JavaBean中。
正如一些人所建议的那样,Ajax或iframe应该做快速修复。
我现在知道最好不要滥用重物的会话, 但我不确定如何最好地重构当前的混乱局面。 有些人建议制作网络应用无状态。 任何重构的建议都是值得欢迎的。
答案 0 :(得分:7)
这可能是您的框架的情况,也可能不是这种情况,但我认为如果您的页面只使用AJAX每隔五分钟(或其他)调用服务器,那么这将使您的用户的会话保持活动状态。您甚至不必以这种方式部分保存表单。
答案 1 :(得分:4)
使您的应用程序在服务器端无状态。您可以在隐藏的输入字段中包含需要维护的任何状态。如果担心安全问题,那么您可以在将数据放入现场之前加密数据。
一个例子是在你的表单中加入这样的东西:
<input type="hidden" name="user" value="bob" />
<input type="hidden" name="currentRecordId" value="2345" />
<input type="hidden" name="otherStuff" value="whocares" />
这样做的主要优点是您的网络应用程序可以只使用该页面完成所需的一切。它不需要任何会话变量,因为它需要的所有内容都在它刚收到的页面中。现在无论他们花多长时间都没关系,因为没有会话到期。
第二个优点是它可以减少服务器上的负载,因为它不会定期轮询您的用户。
答案 2 :(得分:2)
我最近才需要查看此问题的解决方案。
看起来最有希望的方向是使用AJAX定期检查是否输入了数据,并将其发送到服务器。如果贵公司运行的浏览器支持AJAX,这是一种可能性。
另一种可能的解决方案是将表单拆分,这样每个部分都足够小,可以在会话超时内填写并提交。
答案 3 :(得分:2)
如果您要为有限数量的用户(例如,公司内部网)创建应用程序,并且您不希望人们整天不得不继续登录,或者让他们在长时间停留时丢失输入信息时间,您可以无限期地保持会话开放,只有那些浏览器对您的网站开放而不会将会话超时设置为未过期的人。一旦他们关闭网站,会话就会正常到期。
您需要做的是在页面的某处添加隐藏的iframe。让iframe指向由您的应用服务器提供的简单html文档,其中包含元标记,每29分钟刷新一次(对于30分钟内过期的会话)。这样,只要此人打开您的网页,他们的会话就不会过期。但是,当他们离开您的网站时,它将正常到期。您可以获得无限的会话长度,而不会失去控制失败的会话。
我在以前的工作地点的企业环境中成功部署了此解决方案。 Web应用程序取代了旧的绿屏应用程序,例如,他们去吃午餐并让应用程序到期时是不可接受的。
如果您需要更多示例,请与我们联系。
答案 4 :(得分:1)
我建议你研究一下无状态的替代方案(不依赖于会话属性)。
如果我们知道您依赖会话的确切内容,我们可能会提供更多帮助。
答案 5 :(得分:0)
您可以偶尔将数据存储在cookie中,使用Gears作为临时存储(如果数据很复杂或需要超过4K存储),或者使用AJAX每n秒将临时数据发送到服务器。
答案 6 :(得分:0)
嗯..
如何向用户显示即将过期的会话 - 保存数据(比如说5分钟前),以便他们可以保存数据。通过这种方式,他们知道他们必须保存什么,如果会话确实需要过期,如果他们没有回复,那么将在之后完成。
如果您想避免使用AJAX连续ping服务器,这是一种替代方法。
答案 7 :(得分:0)
不要使用会话对象。这是各种可用性问题的原因 - 正如您所发现的那样。
这是我的Web应用程序开发的黄金法则:不要使用会话。
话虽如此,请谨慎使用,否则就无法做到。
答案 8 :(得分:0)
我会在“Ajax检查会话过期后”触发一个模式窗口中的弹出窗体,用户必须再次登录,此弹出窗口覆盖图将覆盖当前页面/窗体。所以数据不会丢失。
P.N如果U在隐藏字段中有一个...,则更新会话令牌。