【问题标题】:How to maintain user object throughout the application using session in javajava - 如何使用java中的会话在整个应用程序中维护用户对象
【发布时间】:2017-01-27 18:45:06
【问题描述】:

我正在编写一个应用程序,我正在将用户对象设置为会话,但我无法将该会话放入另一个控制器。我想在整个应用程序中保持该会话(直到用户注销)。那么我怎样才能将会话对象放入另一个控制器并贯穿整个应用程序。在整个应用程序中维护会话需要遵循哪些步骤。

进入会话:

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

【问题讨论】:

    标签: java session


    【解决方案1】:

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

    所以我可以拥有

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

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

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

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

      map.remove(Thread.currentThread());

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

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

    【讨论】:

    • 在否决之前,您能告诉我我提出的解决方案有什么问题吗?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-02
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 2015-08-15
      • 2012-01-26
      相关资源
      最近更新 更多