java如何在会话中存储检索到的对象,并在会话结束后访问它?
我正在尝试创建一个简单的登录页面。我使用hibernate从数据库中检索User
对象。这部分很好,我的做法如下:
//data from login form
String username = request.getParameter("username").trim();
String password = request.getParameter("password").trim();
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
try {
User currentUser = (User) session.get(User.class, username);
if(password.equals(currentUser.getPassword())) {
response.sendRedirect("index.jsp?page=login&success=true");
} else {
session.getTransaction().rollback();
response.sendRedirect("index.jsp?page=login&success=false");
}
} catch //...
如果凭据正确,则登录成功。如果我理解正确,我上面的代码已经将用户存储在会话中,如果登录成功,那么我所要做的就是访问会话
但是,我不知道如何从我网站的其他地方的会话中访问检索到的User
对象。用户登录后,我想在我的网站上显示特定于用户的信息,为此,我需要检查用户名以及用户是否登录
总之:我如何在我的网站的其他部分使用检索到的User
对象
我刚开始学习javaee和hibernate,所以请耐心听我说
# 1 楼答案
HttpSession与Hibernate会话不同。Hibernate会话提供了一种查询和保存存储在数据库中的持久实体的方法。HttpSession由servlet容器提供,用于 根据用户请求中提供的cookie存储给定用户的对象
您在HttpSession中存储的内容应该是最小的,部分是为了节省集群中节点协调会话的开销,但主要是为了使您的应用程序不那么容易出错。在这里,将用户ID存储在会话中而不是整个用户对象中就足够了。即使用户对象包含角色,最好为每个请求查找这些角色,以便立即应用任何更改。另外,通过只存储ID,您可以避免重新附加实体的问题(这样您就可以避免使用Hibernate时更容易混淆和麻烦的部分)。当应用程序中的其他内容需要访问用户时,它可以查询Hibernate会话(使用
session.get(id)
),传入存储在HttpSession中的主键值您应该使用单向散列来存储密码,以便更改比较密码的方式
应用程序应该只在初始化时创建一次Hibernate SessionFactory,它是线程安全的,应用程序中的所有内容都应该使用该实例
回滚只需选择的事务似乎是不必要的
通常,您只能从视图和web控制器访问HttpSession。看起来您将web控制器逻辑和业务逻辑放在一起,a division of responsibilities between controller and service在这里可能会有所帮助
# 2 楼答案
假设您在一个Web应用程序中,并且希望从
User
实体中得到一些东西,那么您应该将相同的值/引用传播到Web/控制器层(如果您使用的是MVC方法);然后把它放在那里,因为它是通过大多数框架提供的HTTP会话存储东西的最合适的地方建议
SessionFactory
应该实例化一次李># 3 楼答案
您可以使用HttpServletRequest对象可以检索的HttpSession来完成
现在,要检查用户对象是否存在于应用程序的不同部分,可以执行以下操作:
要注销用户,或者换句话说,要使会话无效,可以调用invalidate方法
有用的链接:HttpServletRequest和HttpSession
# 4 楼答案
您在此处提到的会话(org.hibernate.Session)是无法从网站的其他位置访问,而是将用户对象放入一个HttpSession