2009-12-15 124 views
4

我开发了一个简单的Web应用程序,包含2个servlet A和B.Tomcat中的会话管理

我对Tomcat的Web应用程序的会话管理有几个疑问。

注 - 我在访问网络应用程序时在我的网络浏览器(Chrome)中禁用了Cookie。

1.)当网络应用程序第一次命中时,Servlet A被调用。 Servlet A从请求中访问会话并执行会话哈希码的简单sysout。然后它做sendRedirect到servlet B.

[根据我的理解,由于这是第一个请求,Tomcat会发送一个包含新会话ID的cookie回浏览器。但是,由于我们没有使用HttpResponse.encodeRedirectURL()“重新编码”重定向URL,重定向URL将不包含附加到其的会话ID。如果我在这里错误,请纠正我。]

2.)由于Cookie在我的浏览器中被禁用,它将忽略cookie中发回的会话ID,并向重定向URL发出新请求没有会话ID追加到它)。

3.)新请求导致servlet B被调用,whoch也访问请求会话并执行会话散列码的sysout。

让我感到困惑的是Servlet A和B都输出相同的会话哈希码,这意味着它们会从这两个请求中获得相同的会话。

即使没有发送会话ID,浏览器的第二个请求如何映射到与之前相同的会话?

谢谢!

回答

2

只有两种方法可以在请求之间传递会话:Cookie和URL重写。如果您在URL中没有看到会话ID,则它必须是cookie。

您确定cookie被禁用?从HTTP标头跟踪中应该很容易看到。

1

您确定已禁用“内存”Cookie吗?通常浏览器会让你禁用保存到磁盘的永久性cookies,但是它们仍然允许在浏览器会话期间只保留常驻的内存cookie中的瞬态。

我建议使用Wireshark来分析HTTP流。这样你可以看到浏览器发送和接收的cookies。

0

这很奇怪。

当我昨天测试应用程序时,它显示出与我所描述的类似的行为。但是,当我现在测试应用程序时,它的表现完美,正如我所期望的那样。

原因可能是因为禁用cookie后我没有重新启动浏览器会话。

如果我再次遇到同样的行为,请告诉你们。

感谢您的时间家伙!