会话是如何处理的?

3

当用户首次访问一个网站时,初始的服务器响应可能包含一个 SET-Cookie 头来设置会话 ID。例如:

Set-Cookie: JSESSIONID=04427E42C4AE7A5DD1CCE86B8B5F7110; Path=/TestSite/; HttpOnly

然后客户端将在后续的HTTP请求中携带它,这样就可以在cookie header中找到它,例如:
Cookie: JSESSIONID=04427E42C4AE7A5DD1CCE86B8B5F7110

我的问题是:

  1. 所以真正的会话对象是在服务器上创建和维护的一些数据结构。服务器只向客户端发送其索引键。当后续请求到来时,服务器将使用该键来查找存储在服务器上的会话数据。如果必要,服务器可以使用数据库来存储会话数据。这个想法正确吗?

  2. 以下Java代码实际上正在操作存储在服务器上的会话数据。虽然它看起来像是在操作请求对象。对吗?

    request.getSession().setAttribute("accountId", user.getId());

  3. 以下代码本质上是一个键(sessionid)查找过程。它通过查找从客户端发送的“session id” cookie来查找服务器上的会话对象。对吗?

    Session s = (String) request.getSession();

  4. 是否有可能服务器不发送“Set-Cookie”头?或者它是强制性的吗?

  5. 似乎像Redis这样的键值存储非常适合会话存储。有人试过吗?

1个回答

4
实际上,真正的会话对象是在服务器上创建和维护的一些数据结构。
对于servlet会话而言是这样的。但是一般来说,你也可以将“真实数据”存储在会话cookie本身中。它的缺点是用户可以看到它并且可以操纵它,而且它只能相当小,但它的优点是服务器不必存储状态(并与其他服务器共享)。
下面的Java代码实际上是操作存储在服务器上的会话数据。
没错。Servlet API通过请求提供了这个接口,因为这样它就与会话键(和各个用户)相关联了。
服务器是否发送Set-Cookie头部?或者说这是强制性的吗?
你可以关闭它。如果你需要会话,但不想要cookie,那就有点复杂了。你可以将查询参数附加到每个URL上。
似乎像Redis这样的键值存储非常适合会话存储。有人试过吗?
是的,这是一个常见的设置。
Servlet容器的默认设置是将会话存储在内存中。这不需要任何配置或准备工作,但仅适用于单服务器部署。如果你有多个服务器,你需要共享会话信息(使用类似Redis的东西),或者有“粘性会话”(配置网络始终将同一用户发送到同一服务器)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接