当用户第一次访问网站时,initial
服务器响应可能包含SET-Cookie
标头以设置会话ID。如:
Set-Cookie: JSESSIONID=04427E42C4AE7A5DD1CCE86B8B5F7110; Path=/TestSite/; HttpOnly
然后,客户端将在cookie header
中携带它以用于后续HTTP请求:例如:
Cookie: JSESSIONID=04427E42C4AE7A5DD1CCE86B8B5F7110
我的问题是:
因此真正的会话对象是在服务器上创建和维护的一些数据结构。服务器只是将其index key
发送给客户端。当后续请求到来时,服务器将使用该密钥在服务器上查找会话数据存储。如有必要,服务器可以使用数据库来存储会话数据。 这张头脑图片是否正确?
以下Java代码实际上是在处理存储on server
的会话数据。 Though
看起来它正在操纵请求对象。正确?
request.getSession().setAttribute("accountId", user.getId());
以下代码基本上是关键(sessionid)查找过程。它通过查找on server
Cookie session id
来查找会话对象sent from client
。正确?
Session s = (String) request.getSession();
服务器是否有可能不发送Set-Cookie
标头?或者是强制性的吗?
似乎某些键值存储如Redis
非常适合会话存储。有人试过吗?
答案 0 :(得分:3)
因此真正的会话对象是在服务器上创建和维护的一些数据结构。
使用servlet会话,是的。但总的来说,您还可以存储"真实数据"在会话cookie本身。有缺点,用户可以看到它并弄乱它,并且它只能非常小,但具有服务器不必存储状态(并与群集中的其他人共享)的优点。/ p>
以下Java代码实际上是在处理存储在服务器
上的会话数据
那是对的。 Servlet API通过request
提供此接口,因为它与会话密钥(以及单个用户)相关联。
服务器是否有机会发送Set-Cookie标头?或者是强制性的吗?
你可以关闭它。如果您需要会话,但不想要cookie,则会有点复杂。您可以将查询参数附加到每个URL。
似乎像Redis这样的一些键值存储非常适合会话存储。有人试过吗?
是的,这是一种常见的设置。
servlet容器的默认设置是将会话存储在内存中。这不需要任何配置或准备,但仅适用于单服务器部署。如果您有多个服务器,则需要共享会话信息(使用Redis之类的东西),或者拥有"粘性会话" (将网络配置为始终将同一用户发送到同一服务器)。