【问题标题】:JavaEE - Web application, and logic for navigationJavaEE - Web 应用程序和导航逻辑
【发布时间】:2015-02-13 22:35:50
【问题描述】:

我一直在使用 Spring MVC 测试一个 Web 应用程序,并且我目前正在为帐户开发一个编辑器页面。这个 JSP 页面能够编辑一个或多个帐户,用于不同的目的。例如,普通用户可以在此页面上编辑帐户数据。另一方面,管理员用户可以在此页面上编辑多个帐户。就逻辑而言(对我而言),管理员用户的多个帐户的版本是这样的:

  1. 用户选择一个帐户列表。
  2. 列表到达控制器。
  3. 控制器存储帐户列表。
  4. 控制器将用户引导至编辑页面。
  5. 用户填写编辑表单。
  6. 表单被发送到控制器。
  7. 控制器检索之前保存的帐户列表。
  8. 编辑表单数据会反映在记录列表中。
  9. 该列表已从存储中删除。

当用户不执行第 5 步并决定执行其他操作时,就会出现我的问题。如果不从存储中删除列表,服务器将遭受内存泄漏。检测用户退出非常重要,这会导致系统自动删除列表。

我选择将要编辑的帐户列表保存在服务器端,以防止它保存在用户端用户很可能会篡改数据。

我可能会使用 JavaScript 来检测用户何时离开页面,但他/她可能会关闭 Javascript,这会导致同样的问题。因此,这是一个不切实际的解决方案

我还没有开发它的实现,所以我现在只是在做计划。谁能帮我这个?难道我做错了什么? 我的逻辑是否有错误,还是我留下了一些有用的东西?

OBS:我正在使用 Tomcat 8.0 和 Spring MVC 4.1.1,以及 Java JDK 8。

【问题讨论】:

  • 别管它,垃圾收集器最终会为你处理的。
  • 您的数据保存在哪里,用户通常会选择多少数据?不建议在会话中存储大量数据 - 您应该只在会话中存储标识符列表,并在编辑时一次获取/持久化一个帐户。

标签: java spring spring-mvc tomcat servlets


【解决方案1】:

这就是会话管理的全部目的。您的网络服务器会为您完成。 当您使用 Java EE 或任何其他会话技术时,服务器应该处理超时,清理会话对象。这是根据用户空闲时间发生的。服务器如何知道用户空闲?因为对于浏览器发送的每一个请求,他的会话 id 都会在 cookie 中发送。

通常,超时阈值是一个可变的时间段(通常在 web.xml 中定义)。此值可能需要根据可用的网络/内存资源和预期的同时用户进行调整。

事实上,会话+cookie 是处理 HTTP 的无状态特性的唯一灵活且安全的方法。

这有一些变体,即对话或视图范围,其中用户可能每个标签都有一个会话。但原理是一样的:把东西放在 session 中,稍后通过 session id(客户端的 cookie)获取它们。

最后,你不应该依赖浏览器来做服务器的事情。这不可靠。

【讨论】:

  • 嗨 Luís Soares。谢谢回答。你能确认一下用户会话数据的存储位置吗?它们存储在服务器端还是客户端?诚然,客户端保留了一个向服务器标识自己的 cookie,但数据呢?自从你回答我以来,我一直在寻找这个。与一两个可信来源确认这一点,我会认为您的回答是正确的。另外,如果我找到它,我也会考虑它。不管怎样,提前谢谢你。
  • 嗯.. 原则上,这些会话存储在服务器端 RAM 中。这适用于 Java、php、.net 等。您想要概念响应还是基于特定技术的响应?因为我不确定您的疑问是概念性的还是技术性的。
  • 如果我很挑剔,我很抱歉,但不幸的是,我需要确认这一点。当你回答我时,我想象会话数据存储在内存中。在您回答之前,对我来说,会话​​数据存储在用户端。当我使用 Servlet 和 Tomcat 时,是否有文档说明/说明会话存储在哪个位置(服务器/客户端、内存/文件)?自从你回答我之后,这就是我正在寻找的东西。
  • 当然你可以挑剔。我只需要给出一个一般性的回应来理解你的疑问。在 Java EE 中,Web 服务器必须遵守标准。因此,Web 服务器并不重要。无论库(弹簧或其他)如何,都使用 Servlet。然后我会搜索文档:)
  • 顺便说一句,tomcat 没有实现 Java EE(tomee 有)。它只提供Java web,这并不意味着你没有会话。
猜你喜欢
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 2015-11-10
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多