设计问题 - webapp会话中的持久数据

时间:2010-02-21 16:14:54

标签: java jsp servlets

我正在使用servlets和jsps开发一个Web应用程序。我有一个关于存储我需要在登录会话中跨多个servlet使用的数据的问题。例如,当用户登录时,我从db获取用户对象并希望将其存储在某处并让后续的servlet和jsps使用它而无需再次查询db。我知道我必须将对象存储在全局数组中,但我无法找到最佳方法。

我正在考虑在webapp加载时创建静态hashmap或其他一些数据结构,我可以使用它来存储用户对象,sessionID作为hashmap的关键字。

有更好的方法吗?任何帮助表示赞赏。

谢谢, - Vas

4 个答案:

答案 0 :(得分:5)

您无需自行管理会话。 servletcontainer将以HttpSession的风格透明地为您完成。您通常使用HttpSession#setAttribute()在会话范围中存储对象,并使用HttpSession#getAttribute()从会话范围中获取对象。您可以使用HttpServletRequest#getSession()来获取对HttpSession

的引用

E.g。在登录servlet中:

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user);
} else {
    // Show error?
}

您可以稍后在任何servlet中获取它,或者通过

在同一会话中过滤
User user = (User) request.getSession().getAttribute("user");
if (user != null) {
    // User is logged in.
} else {
    // User is not logged in!
}

您甚至可以通过JSP在JSP中访问它:

<p>Welcome, ${user.username}!

(假设有一个Javabean getUsername()方法)

答案 1 :(得分:4)

有一种方法可以做到这一点,它是在servlet规范中定义的。您可以获取HttpSession对象并将对象添加为“属性”。

点击此处查看API:http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpSession.html

答案 2 :(得分:1)

根据您的需求和实施情况,您还可以考虑以下选项:

  • 使用户对象可序列化并存储在会话中;在这种情况下,您必须确保对用户对象的后续更改传播到会话或数据库中存储的对象(取决于哪些更改)
  • 在会话中仅存储用户ID并在DAO /存储库中实现缓存,因此如果不必要,将不会调用真正的数据库查询;如果你正在使用Hibernate或其他一些ORM,你可能会开箱即用这个功能;这似乎是最少侵入性的,因为如果由持久层
  • 正确处理,对用户对象的修改将与应用程序状态和DB同步

那里可能还有很多选择。

答案 3 :(得分:1)

我们正在构建像livemocha.com这样的社交网络,我们建议您尽可能减少会话。

仅在会话中存储用户ID就足够了,当然,您无需确保将对用户对象的后续更改传播到存储在会话或数据库中的对象(具体取决于哪个更改)。 ; - )