2011-03-27 67 views
1

在Java Web应用程序中,Java servlet创建唯一的jsessionid,该cookie作为cookie传递到客户端浏览器,以跟踪第一个请求之后的客户端的后续请求。但是,当Cookie被禁用并且由于安全策略而不允许URL重写时,我的理解是Java servlet会为来自同一客户端的每个请求创建一个新的会话对象。它是否正确?这是否意味着大量的服务器内存浪费(每个会话对象的内存分配过多,永远不会再使用和过多的垃圾收集)?如何识别网站访问者禁用cookie并禁止URL重写?

一种解决方案是在这种情况下使用客户端的IP地址和用户代理字符串来唯一标识用户并存储在数据库中。这是正确的解决方案?

以上情况在搜索引擎僵尸程序中相当常见,它们在访问网站时通常会发出数千次频繁的请求。

任何其他想法为基于Java的Web应用程序的这个问题制定适当的解决方案?

回答

3

是的,在这种情况下,每次都会创建会话。这些确实会花费内存并最终需要GC'ed。

如果您不需要跟踪用户,您可以随时选择禁用会话创建。在JSP中,这有点困难,因为页面通常会创建一个会话。有一个指令可以关闭此功能。

然而,您可以编写一个过滤器和servlet请求包装器,以防止创建会话。

在JSF中,大量使用的Mojorra 2.04实现中存在一个非常不幸的错误,这使得它或多或少无法做到这一点,但幸运的是Mojarra 2.1.0已经解决了这个问题。

如果您确实需要跟踪用户,可以使用指纹形式。这总是近似的,我认为你不应该使用这个登录。 IP +用户代理是指纹识别的一种形式,但由于代理和大型组织为其所有工作站安装完全相同的浏览器,因此这是相当不可靠的。使用统计信息没问题,但完全不适合登录。

替代品正在使用HTTPS/SSL,因为此协议具有内置类型的“会话ID”,或者使用DOM或Flash存储器,并非禁用所有禁用Cookie的人都会禁用。

+1

很好的答案。我会加上一个压力:你不能通过IP + USER_AGENT来识别某人。 – 2011-03-27 11:27:19