在Java Web应用程序中,Java servlet创建唯一的jsessionid,它以cookie的形式传递给客户端浏览器,以跟踪客户端在第一个请求之后的后续请求。但是当禁用cookie并且由于安全策略而不允许URL重写时,我的理解是Java servlet将为来自同一客户端的每个请求创建一个新的会话对象。它是否正确?它是否意味着大量浪费服务器内存(每个会话对象的内存分配过多,永远不会再次使用和过多的垃圾回收)?
在这种情况下使用的一种解决方案是使用客户端的IP地址和用户代理字符串来唯一地标识用户并存储在数据库中。这是正确的解决方案吗?
以上情况在搜索引擎机器人的情况下相当常见,它们在访问网站时通常会发出数千条频繁请求。
有关为基于Java的Web应用程序制定此问题的正确解决方案的其他想法吗?
答案 0 :(得分:3)
是的,在那种情况下,每次都会创建会话。这些确实会花费内存,最终需要GC。
如果您不需要跟踪用户,您可以随时选择禁用会话的创建。在JSP中,这有点困难,因为页面通常总是创建会话。虽然有一个指令要关闭它。
但是,您可以编写一个过滤器和servlet请求包装器,以防止创建会话。
在JSF中,使用得很多的Mojorra 2.04实现中存在一个非常不幸的错误,这使得或多或少无法做到这一点,但幸运的是Mojarra 2.1.0修复了这个问题。
如果您确实需要跟踪用户,可以使用一种指纹形式。这总是近似的,我不认为你应该使用它来登录。 IP +用户代理是指纹识别的一种形式,但由于代理和大型组织为其所有工作站安装完全相同的浏览器,因此非常不可靠。使用统计信息是可以的,但完全不适合登录。
备选方案正在使用HTTPS / SSL,因为此协议具有内置类型的“会话ID”,或使用DOM或Flash存储,并非所有禁用cookie的人都会禁用。