3

是否可以通过 Servlet API 为 HTTP 会话分配自定义 ID?

我知道来自任何应用程序服务器的会话处理,例如 Tomcat,生成唯一 ID 就足够了。但我有基于每个用户和时间的信息的自定义唯一会话 ID,因此不会重复。

我查看了所有关于会话处理的文档,但没有找到我需要的东西。

这是一个项目的要求,所以如果不可能,我需要知道原因(或者它只是不能通过 API 获得?)。

4

3 回答 3

4

If you are using Tomcat, you may be able to create a custom session manager (see this discussion). You would then have access to the Tomcat Session object and could call setId.

于 2008-10-13T02:01:33.010 回答
2

servlet API 不支持创建您自己的 cookie 值。事实上,它不保证会话是通过 cookie 维护的……它特别指出它们可以通过诸如“URL 重写”之类的机制来维护。它确实保证会话以某种方式维护,并且几乎需要某种唯一 ID,该 ID 被传递给浏览器并返回,但是 Servlet API 中没有为 servlet 代码提供控制使用什么值的机制。我所知道的常见 servlet 容器(例如 Tomcat)也没有提供控制此值的方法。

但是,如果我正确理解您的要求,这对您来说都不是问题。仅仅因为 Tomcat(或您使用的任何 servlet 容器)正在根据其自己的算法创建一个唯一 ID(其中包含诸如加密安全随机数生成器之类的东西,以防止会话 ID 的“猜测”),并不意味着您不能创建一个满足您要求的单独 ID(基于用户和时间,在所有会话中唯一......无论您需要什么)。此 ID 可以存储在会话中(如果这就是您所需要的),也可以存储在浏览器中的单独 cookie 中(如果您需要跨会话维护它)。唯一的影响是浏览器存储了两个 cookie——大多数网站存储的 cookie 比这多得多!

于 2008-10-13T00:27:46.320 回答
1

嗯...如果您有生成唯一 ID 的代码,您可以这样做:

/** 
 * The String key of the user id attribute.
 */
public static final String USER_ID_KEY = "userIdKey";

// Set the user attribute (createUniqueUserId's parameters and return type are up to you)
httpSession.setAttribute(USER_ID_KEY, createUniqueUserId());

// Retrieve the user attribute later
httpSession.getAttribute(USER_ID_KEY);

HttpSession 接口还提供了一个 getId() 方法,这里有文档说明复制文档供参考):

公共 java.lang.String getId()

返回一个字符串,其中包含分配给此会话的唯一标识符。标识符由 servlet 容器分配,并且依赖于实现。

返回: 指定分配给此会话的标识符的字符串

于 2008-10-13T00:12:47.160 回答