如何处理会话?

时间:2015-11-20 08:19:53

标签: java asp.net session redis webserver

当用户第一次访问网站时,initial服务器响应可能包含SET-Cookie标头以设置会话ID。如:

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

然后,客户端将在cookie header中携带它以用于后续HTTP请求:例如:

Cookie: JSESSIONID=04427E42C4AE7A5DD1CCE86B8B5F7110

我的问题是:

  1. 因此真正的会话对象是在服务器上创建和维护的一些数据结构。服务器只是将其index key发送给客户端。当后续请求到来时,服务器将使用该密钥在服务器上查找会话数据存储。如有必要,服务器可以使用数据库来存储会话数据。 这张头脑图片是否正确?

  2. 以下Java代码实际上是在处理存储on server的会话数据。 Though看起来它正在操纵请求对象。正确?

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

  3. 以下代码基本上是关键(sessionid)查找过程。它通过查找on server Cookie session id来查找会话对象sent from client。正确?

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

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

  5. 似乎某些键值存储如Redis非常适合会话存储。有人试过吗?

1 个答案:

答案 0 :(得分:3)

  

因此真正的会话对象是在服务器上创建和维护的一些数据结构。

使用servlet会话,是的。但总的来说,您还可以存储"真实数据"在会话cookie本身。有缺点,用户可以看到它并弄乱它,并且它只能非常小,但具有服务器不必存储状态(并与群集中的其他人共享)的优点。

  

以下Java代码实际上是在处理存储在服务器

上的会话数据

那是对的。 Servlet API通过request提供此接口,因为它与会话密钥(以及单个用户)相关联。

  

服务器是否有机会发送Set-Cookie标头?或者是强制性的吗?

你可以关闭它。如果您需要会话,但不想要cookie,则会有点复杂。您可以将查询参数附加到每个URL。

  

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

是的,这是一种常见的设置。

servlet容器的默认设置是将会话存储在内存中。这不需要任何配置或准备,但仅适用于单服务器部署。如果您有多个服务器,则需要共享会话信息(使用Redis之类的东西),或者拥有"粘性会话" (将网络配置为始终将同一用户发送到同一服务器)。