我正在编写一个应用程序,因为我将用户对象设置为会话,我无法将该会话转换为另一个控制器。我想在整个应用程序中维护该会话(直到用户注销)。那么如何将会话对象放入另一个控制器和整个应用程序中。在整个应用程序中,我需要遵循哪些步骤来维护会话。
设置为会话:
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");
答案 0 :(得分:0)
我遇到了你的问题,因为我也遇到了同样的问题。 我认为我们可以依赖Tomcat的请求处理机制 - 每个请求都在一个线程中运行。
所以我可以
将网址设置为/ *进行过滤,这意味着每个请求都会通过此过滤器。过滤器将当前线程和请求对象添加到静态映射。
map.put(Thread.currentThread(), httpRequest);
由于地图是某个类的静态字段,因此所有线程都可以访问它,如果您需要在不同控制器之间共享对象,请通过请求的生命周期将其放入此映射中,例如:把httpsession作为一个属性放在你想要的任何地方。
在过滤器中,在请求完成后从地图中删除线程。
map.remove(Thread.currentThread());
如果我们使用WeakHashMap,我想我们可以跳过第3步。
我还没有尝试过这种方法,但我认为它应该可行。我会在尝试时分享结果。
答案 1 :(得分:0)
我在另一次讨论中找到了完整的答案。 Get the HttpServletRequest (request) object from Java code
对我来说最有用的讨论部分是由skaffman发布的。请在下面找到。
Spring为此目的提供了RequestContextFilter 。它使用ThreadLocal,并允许代码通过RequestContextHolder获取当前请求。请注意,此过滤器不要求您使用Spring的任何其他部分: