【问题标题】:Can not understand the session object behavior无法理解会话对象的行为
【发布时间】:2012-01-13 16:07:05
【问题描述】:

我对@9​​87654321@ 的文档感到困惑。
它说:

会话用于跨多个维护状态和用户身份 页面请求。会话可以通过使用 cookie 或 通过 URL 重写。

现在 cookie 和 URL 重写都由服务器中的应用程序代码(即我们的代码)处理。

然后它说与何时将会话视为new

服务器认为一个会话是新的,直到它被加入 客户端。直到客户端加入会话,isNew 方法 返回 true。true 值表示以下三种情况之一:
1. 客户端还不知道会话
2. 会议尚未开始
3. 客户端选择不加入会话。如果客户端仅支持 cookie 并选择拒绝任何 cookie,就会出现这种情况 由服务器发送。如果服务器支持 URL 重写,这种情况 一般不会发生。

我不清楚何时考虑/意味着client has joined the session

我的意思是,如果我不使用来自我的网络应用程序(或 URL 重写)的 cookie,并且我有以下内容:

  1. 从 IP A POST 到服务器
  2. 200 OK 从服务器到 A
  3. 从 IP A POST 到服务器

在第 3 步中,session.isNew() 将返回 true 还是 false?从文档中我不清楚。
它会返回 false(即会话不是新会话)并且我必须调用 session.invalidate() 才能创建新会话?
这让我更加困惑的原因是因为我正在调试一段代码,其中客户端是 HTTP 应用程序而不是 Web 浏览器,我看到在第 3 步中 session.isNew() 没有返回 true 尽管没有 cookie 或在服务器代码中重写 url。
所以我无法弄清楚引擎盖下发生了什么。
有什么信息可以帮助理解这一点吗?

【问题讨论】:

  • 您似乎对cookie感到困惑:servlet容器会在响应中为您添加会话cookie,并从请求中为您读取。你不需要做任何事情。如果客户端浏览器不接受 cookie,则会自动使用 URL 重写,并且只要您始终对 URL 进行编码(使用 encodeURL、encodeRedirectURL 或适当的 JSP 标签),它将起作用
  • @JB Nizet:我认为 HTTP 是无状态的。所以由程序员来维护会话。所以你告诉我无论如何容器都有会话?
  • 当您要求容器创建会话时(使用 request.getSession() 或 request.getSession(true)),容器将会话 cookie 添加到发送给客户端的下一个响应中,并附加会话 ID 到编码的 URL)。当它从下一个请求(或 URL 末尾的会话 ID)接收到 cookie 时,它​​可以将请求与之前创建的会话相关联。如果您的客户端不接受 cookie,您无需执行任何操作,只需对 URL 进行编码。会话跟踪和超时由容器完成。
  • 啊!我没有意识到request.getSession() 创建了session。很有帮助!

标签: java session jakarta-ee session-management


【解决方案1】:

这是Session Tracking的一个很好的例子

Client has joined the session 表示客户端发出后续请求并包含会话ID,您的网络服务器可以识别该会话ID。如果启用了 cookie - jsessionid 将与 cookie 一起传递,否则 - 它应该包含在 URL 本身中 - 就像这样 http://localhost:8080/bookstore1/cashier;jsessionid=c0o7fszeb1

在来自核心标签库的 JSP c:url 中,将为您处理 URL 重写。

如果是 B2B 通信,您必须自己获取会话 ID 并手动将其包含在后续请求中。

示例:

  1. 从 IP A POST 到服务器
  2. 200 OK 从服务器到 A
  3. A 从响应中获取session id
  4. 从 IP A POST 到服务器并包括获得的session id

更新:

考虑阅读一篇很棒的文章 - "Web Based Session Management: Best practices in managing HTTP-based client sessions." 这是关于如何模拟 HTTP 会话并且不依赖于 Java 的一般概述。

【讨论】:

  • 不是jsessionid java 特有的吗?
  • 是的,它是特定于 java 的。 JavaEE 兼容的服务器必须使用此名称,但有些服务器允许配置此名称。
  • 但是我使用的客户端不是Java
  • 由于 Java Web 服务器正在跟踪您的会话,因此您的非 Java 客户端必须从响应中提取 jsessionid 并在后续请求中使用它,以帮助 Java Web 服务器跟踪会话。跨度>
  • @user384706:阅读en.wikipedia.org/wiki/HTTP_cookie。浏览器不关心 cookie 名称。您告诉他“这是我的 Web 应用程序的 cookie”,浏览器会在发送到此 Web 应用程序的每个请求时发送此 cookie。名字无所谓。 JEE 选择对 jsessionid 进行标准化,就像 PHP 选择使用 PHPSESSID 一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2015-09-05
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多