【发布时间】:2012-01-13 16:07:05
【问题描述】:
我对@987654321@ 的文档感到困惑。
它说:
会话用于跨多个维护状态和用户身份 页面请求。会话可以通过使用 cookie 或 通过 URL 重写。
现在 cookie 和 URL 重写都由服务器中的应用程序代码(即我们的代码)处理。
然后它说与何时将会话视为new:
服务器认为一个会话是新的,直到它被加入 客户端。直到客户端加入会话,isNew 方法 返回 true。true 值表示以下三种情况之一:
1. 客户端还不知道会话
2. 会议尚未开始
3. 客户端选择不加入会话。如果客户端仅支持 cookie 并选择拒绝任何 cookie,就会出现这种情况 由服务器发送。如果服务器支持 URL 重写,这种情况 一般不会发生。
我不清楚何时考虑/意味着client has joined the session。
我的意思是,如果我不使用来自我的网络应用程序(或 URL 重写)的 cookie,并且我有以下内容:
- 从 IP A POST 到服务器
- 200 OK 从服务器到 A
- 从 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