繁体   English   中英

如何使用Java中的会话在整个应用程序中维护用户对象

[英]How to maintain user object throughout the application using session in java

我正在编写一个应用程序,因为我正在将用户对象设置为会话,而我无法将该会话导入另一个控制器。 我想在整个应用程序中维护该会话(直到用户注销)。 因此,如何将会话对象放入另一个控制器以及整个应用程序中。 我需要遵循哪些步骤来维护整个应用程序中的会话。

进入会话:

public ResponseEntity<Object> getCustMenus(HttpSession session){
    UserInformation userInformationSession = luser.getRolesData();
    session.setAttribute("userInfo", userInformationSession);
}

获取会话:

UserInformation userInformation=(UserInformation) session.getAttribute("userInfo");
System.out.println("-----"+userInformation.getUserName()+"----------username");

我遇到了您的问题,因为我也面临着同样的问题。 我认为我们可以依靠Tomcat的请求处理机制-每个请求都在单个线程中运行。

所以我可以有

  1. 静态映射,其中key是请求Thread对象,值是Httpsession甚至是HTTpRequest对象。 地图
  2. 网址设置为/ *的过滤器,这意味着每个请求都将通过此过滤器。 过滤器会将当前线程和请求对象添加到静态映射。

    map.put(Thread.currentThread(), httpRequest);

由于映射是某个类的静态字段,因此所有线程都可以访问该映射,并且如果需要通过请求的生命周期在不同控制器之间共享对象,则可以将其放入此映射中,例如,将httpsession作为属性并获取它在您想要的任何地方。

  1. 在过滤器中,完成请求后,从映射中删除线程。

    map.remove(Thread.currentThread());

如果我们使用WeakHashMap,我想我们可以跳过第3步。

我还没有尝试过这种方法,但是我认为它应该有效。 尝试时,我将分享结果。

我在另一个讨论中找到了完整的答案。 从Java代码获取HttpServletRequest(请求)对象

对我来说,讨论中最有用的部分是skaffman发布的。 请在下面找到它。

Spring为此提供了RequestContextFilter 它使用ThreadLocal,并允许代码通过RequestContextHolder获取当前请求。 请注意,此过滤器不需要您使用Spring的任何其他部分:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM