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

时间:2016-11-15 11:58:27

标签: java session

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

设置为会话:

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");

2 个答案:

答案 0 :(得分:0)

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

所以我可以

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

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

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

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

      map.remove(Thread.currentThread());

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

      我还没有尝试过这种方法,但我认为它应该可行。我会在尝试时分享结果。

答案 1 :(得分:0)

我在另一次讨论中找到了完整的答案。 Get the HttpServletRequest (request) object from Java code

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

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