跟踪用户"当前对象"的最佳做法在网站上

时间:2015-09-08 17:29:34

标签: java web

当用户与网站进行互动时,通常会有一些对象被认为是当前的"对象,就像购物车,或者,在我的世界中使用一个例子,制造工作。在页面之间跟踪当前对象的最佳做法是什么?我能想到一些:

  1. 将ID作为请求参数(缺点是安全性,因为a 黑客可以使用它将URL更改为其他ID)
  2. 会话对象(缺点是如果您有大量用户 和/或当前对象的内存占用量很大)
  3. 饼干吗? (Haven没试过那个)
  4. 我错过了一些明显的答案吗?

    顺便说一下,我们正在使用Java,WebLogic和Struts1。

3 个答案:

答案 0 :(得分:2)

这真的取决于你的技术堆栈是什么"最佳实践"现在就适合你。

例如,如果您使用没有MVC前端或其他任何内容的ERB模板构建传统的Rails应用程序,那么我认为使用Rails框架为您提供的会话对象将是最好的。

大多数网络框架将为您提供一种简单的方法来跟踪浏览网站的特定用户。我见过的大多数都使用了第二种和第三种选择的组合。它们具有在用户的浏览器中存储为cookie的会话ID,并且每次用户向Web服务器发送请求时,它使用存储的会话ID值从内存或数据库加载Session对象。在那个cookie里。除非您拥有大量用户,否则内存不应成为问题,但这也取决于您在那里存储的信息类型。

如果您要存储整个数据库行或记录,并且会话完全存储在内存中,那么您可能应该考虑仅将ID存储到这些记录中。

研究您的特定Web框架,了解它如何处理用户会话。

答案 1 :(得分:2)

就跨平台最佳实践而言,Session对象范例似乎是迄今为止最好的方法。它允许将请求参数匹配到会话跟踪,而与请求参数的处理无关。对此的扩展是,如果重新识别会话(Java使用Map),Session对象提供了一个放置一组东西的便利位置。

通常,会话是反复访问单个网站的单个Web浏览器的表示。由于没有任何内容将一个请求与另一个请求相关联,因此这是通过项目组合综合生成的,包括用户代理字符串,回复IP地址等(过去它是cookie中的存储值,导致安全问题无止境) )。

假设您有一个可靠的Session对象,通常会存储一个假定的“单个用户”驱动会话应该有权访问的项目。因此,如果您有购物车,它可能表示为可从会话访问的购物车对象。在Java中,这可能是一张地图。

识别新会话时

// request is a HttpServletRequest object in this example
if (request.getSession(false)) {
  // must be a new one
  Session newSession = request.getSession(true);
  newSession.putValue("shoppingCart", new ShoppingCart());
}

稍后,加入购物车时

ShoppingCart cart = (ShoppingCart)(request.getSession(false).getValue("shoppingCart"));
cart.addItem(item);

将检测与请求处理分开的好处使得在不改变“会话内容”代码的情况下轻松修复/调整会话跟踪。

答案 2 :(得分:1)

其他答案是正确的。再说一点。

Java Servlet技术的Session对象确实旨在解决这个问题,如何跟踪单个用户的当前对象集,超出HTTP请求 - 响应生命周期。这为有状态的协议(HTTP)提供了有状态。每个Servlet容器(Tomcat,Jetty,WildFly等)都会自动处理详细信息,例如使用cookiesURL rewriting,因此您无需担心这一点。

是的,当您向Session对象添加内容时,其内存使用量会增加。如果内存不足,您的Servlet容器(如Tomcat)可能会选择使用Serialization将较旧的Session对象写入存储。这里的问题是Session中的所有对象都必须是可序列化的。确保您的类(及其所有嵌套对象)可以正确处理序列化可能是一项繁重的工作。

提示:如果可能,请将服务器的内存添加到处理最高会话负载的更多内存。正如智者所说,"算法适用于不知道如何购买的人RAM。"。