我正在使用servlet。当我的用户登录时,我的应用程序将他的userId和deviceId设置为会话变量。
我的应用程序的其他部分现在需要在线人员列表及其userId / deviceId。请注意,用户可能同时登录2个设备,因此我们为同一个userId设置了2个deviceId。
我该如何应对这种情况?我不愿意使用数据库来跟踪登录/注销功能
答案 0 :(得分:4)
将此信息也存储在HttpServletContext的属性中。这个上下文是每个servlet的全局,并且可以被所有会话所接受。
你甚至可以做得更多。使用HttpSessionAttributeListener,您可以在每次添加attribure时收到通知,因此如果您想创建某种监视器应用程序,它可能会更具响应性。
答案 1 :(得分:1)
除了亚历克斯的回应。您要查找的标头属性是user-agent。以下是从请求中访问浏览器类型的代码段。
((javax.servlet.http.HttpServletRequest)pageContext.getRequest())。getHeader( “用户代理”)
答案 2 :(得分:0)
除了Alex和Suken的回复之外,假设用户只有一个会话,您可以将deviceId存储在Map中:
String userAgent = (see Suken's response)
String deviceId = request.getParameter("REQUEST_PARAMETER_DEVICE_ID");
Map<String, String> devices = request.getSession().getAttribute("SESSION_ATTRIBUTE_DEVICES");
if (devices == null) {
devices = new HashMap<String, String>();
request.getSession().setAttribute("SESSION_ATTRIBUTE_DEVICES", devices);
}
devices.put(userAgent, deviceId);
这可确保多个设备保持可见并且不会被覆盖。如果你想在应用程序级别访问它们,你仍然需要像Alex解释的那样公开它们。