有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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,所以请耐心听我说


共 (4) 个答案

  1. # 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. # 2 楼答案

    假设您在一个Web应用程序中,并且希望从User实体中得到一些东西,那么您应该将相同的值/引用传播到Web/控制器层(如果您使用的是MVC方法);然后把它放在那里,因为它是通过大多数框架提供的HTTP会话存储东西的最合适的地方

    建议

    • 您不应该回滚获取/选择操作吗
    • 一个SessionFactory应该实例化一次
  3. # 3 楼答案

    您可以使用HttpServletRequest对象可以检索的HttpSession来完成

    HttpSession httpSession = request.getSession();
    httpSession.setAttribute("user", user);
    

    现在,要检查用户对象是否存在于应用程序的不同部分,可以执行以下操作:

    HttpSession httpSession = request.getSession(false); 
    //False because we do not want it to create a new session if it does not exist.
    User user = null;
    if(httpSession != null){
        user = (User) httpSession.getAttribute("user");
    }
    
    if(user!=null){
        // Do stuff here
    }
    

    要注销用户,或者换句话说,要使会话无效,可以调用invalidate方法

    httpSession.invalidate();
    

    有用的链接:HttpServletRequestHttpSession

  4. # 4 楼答案

    您在此处提到的会话(org.hibernate.Session)是无法从网站的其他位置访问,而是将用户对象放入一个HttpSession

    Here is how you going do this:

    HttpSession httpSession = request.getSession();
    httpSession.setAttribute("loggedUser", your_user_object reference_here );
    

    Here is how you access from other placess:

    httpSession.getAttribute("loggedUser");//return type is Object here