我正在使用servlets和jsps开发一个Web应用程序。我有一个关于存储我需要在登录会话中跨多个servlet使用的数据的问题。例如,当用户登录时,我从db获取用户对象并希望将其存储在某处并让后续的servlet和jsps使用它而无需再次查询db。我知道我必须将对象存储在全局数组中,但我无法找到最佳方法。
我正在考虑在webapp加载时创建静态hashmap或其他一些数据结构,我可以使用它来存储用户对象,sessionID作为hashmap的关键字。
有更好的方法吗?任何帮助表示赞赏。
谢谢, - Vas
答案 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)
根据您的需求和实施情况,您还可以考虑以下选项:
那里可能还有很多选择。
答案 3 :(得分:1)
我们正在构建像livemocha.com这样的社交网络,我们建议您尽可能减少会话。
仅在会话中存储用户ID就足够了,当然,您无需确保将对用户对象的后续更改传播到存储在会话或数据库中的对象(具体取决于哪个更改)。 ; - )