Java 设计问题-webapp会话中的持久数据
我正在使用servlet和JSP开发一个web应用程序。我有一个关于在登录会话中存储需要跨多个servlet使用的数据的问题。例如,当用户登录时,我从数据库中获取用户对象,并希望将其存储在某个位置,然后让后续的servlet和JSP使用它,而无需再次查询数据库。我知道我必须将对象存储在一个全局数组中,但我无法找到最好的方法 我正在考虑在webapp加载时创建一个静态hashmap或其他数据结构,我可以使用它来存储用户对象,sessionID作为hashmap的键 有更好的办法吗?感谢您的帮助 谢谢,Java 设计问题-webapp会话中的持久数据,java,jsp,servlets,Java,Jsp,Servlets,我正在使用servlet和JSP开发一个web应用程序。我有一个关于在登录会话中存储需要跨多个servlet使用的数据的问题。例如,当用户登录时,我从数据库中获取用户对象,并希望将其存储在某个位置,然后让后续的servlet和JSP使用它,而无需再次查询数据库。我知道我必须将对象存储在一个全局数组中,但我无法找到最好的方法 我正在考虑在webapp加载时创建一个静态hashmap或其他数据结构,我可以使用它来存储用户对象,sessionID作为hashmap的键 有更好的办法吗?感谢您的帮助 谢
-Vas有一种方法可以做到这一点,它在servlet规范中定义。您可以获得HttpSession对象并将对象添加为“属性”
在这里看一下API:您不需要自己管理会话。servletcontainer将以透明的方式为您完成这项工作。通常用于在会话作用域中存储对象,并从会话作用域中获取对象。您可以使用获取对
HttpSession
的引用
例如,在登录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中的EL访问它:
<p>Welcome, ${user.username}!
欢迎,${user.username}!
(假设有一个JavaBean <代码> GETUSERAMEMER)(方法)
,根据您的需要和实现,您也可以考虑以下选项:
- 使用户对象可序列化并存储在会话本身中;在这种情况下,必须确保对用户对象的后续更改传播到存储在会话或数据库中的对象(取决于将要更改的对象)
- 在会话中只存储用户ID,并在DAO/存储库中实现缓存,以便在不需要时不会调用真正的DB查询;如果您使用的是Hibernate或其他一些ORM,那么您可能已经具备了这个现成的功能;这似乎是入侵性最小的,因为如果持久层正确处理,对用户对象的修改将与应用程序状态和数据库同步
可能还有更多的选择。我们正在构建一个像livemocha.com这样的社交网络,我们建议您在会话中尽可能少地使用
在会话中只存储用户ID就足够了,当然,您不需要确保对用户对象的后续更改会传播到存储在会话或数据库中的对象(取决于要更改的对象)。;-) 我使用了它们,但是我在一个servlet中设置的属性在请求转发到的jsp中是可见的,但在一个全新的servlet中不是可见的,还是可见的?谢谢!我会看看这些。尽管第二个选项看起来更好,但这是否适用于多个servlet?我看到它只在一个servlet到一个jsp之间工作,而不跨多个servlet。如果在同一个会话中请求servlet,那么它将工作。也许你把它与
request.setAttribute()
混淆了,后者实际上只在同一个请求中起作用。