request.getSession()。getId()vs request.getRequestedSessionId()

时间:2016-08-05 20:07:16

标签: java servlets java-ee httpsession

request.getSession().getId()request.getRequestedSessionId()之间有什么区别?他们俩都返回相同的东西,即会话ID吗?

由于

2 个答案:

答案 0 :(得分:9)

request.getRequestedSessionId()将返回客户端指定的会话ID(可能是在cookie中)。 request.getSession().getId()将返回服务器的会话ID(如果会话不存在,request.getSession()将创建它)。

重要的区别在于您不能依赖request.getRequestedSessionId()返回的值,因为它可能无效。来自文档:

  

返回客户端指定的会话ID。这可能与此请求的当前有效会话的ID不同。如果客户端未指定会话ID,则此方法返回null。

答案 1 :(得分:-1)

HttpRequest.getRequestedSessionId()是由调用者提供的会话ID,通常带有JESSIONID cookie,而HttpRequest.getGession().getId()是服务器有效使用的ID。

对于正在进行的会话,JESSIONID cookie或值为HttpRequest.getRequestedSessionId()允许服务器通过ID查找正在进行的会话。

对于新会话,您可能很想通过JESSIONID cookie提供一个值,即HttpRequest.getRequestedSessionId()来设置服务器会话ID。这样可以很容易地将一个呼叫链与多个服务器相关联,这些服务器由来自客户浏览器的初始呼叫发起。但是,HttpRequest.getRequestedSessionId()的语义不允许这种链接。 实际上,JESSIONID cookie仅对服务器中已经存在并且先前已发送给客户端的会话有效。如果JESSIONID cookie引用了不存在的会话ID,则服务器会创建一个新会话,忽略 JESSIONID cookie的值。

通过阅读doGetSession(boolean)类中org.apache.catalina.connector.Request的源代码,您可以使自己相信以上内容。

相关问题