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

use*_*201 2 java jsp servlets

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

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

有没有更好的办法?任何帮助表示赞赏.

谢谢, - Vas

Bal*_*usC 5

您不需要自己管理会话.servletcontainer将以透明的方式为您做到HttpSession.您通常用于HttpSession#setAttribute()在会话范围中存储对象并从会话范围HttpSession#getAttribute()中获取对象.你可以HttpServletRequest#getSession()用来获取对它的引用HttpSession.

例如在登录servlet中:

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

您可以稍后在任何servlet中获取它或在同一会话中过滤

User user = (User) request.getSession().getAttribute("user");
if (user != null) {
    // User is logged in.
} else {
    // User is not logged in!
}
Run Code Online (Sandbox Code Playgroud)

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

<p>Welcome, ${user.username}!
Run Code Online (Sandbox Code Playgroud)

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