在 JSF 中生成自己的会话 ID

Posted

技术标签:

【中文标题】在 JSF 中生成自己的会话 ID【英文标题】:Generating Own Session Id in JSF 【发布时间】:2011-12-10 16:08:26 【问题描述】:

我有一个使用 JSF 框架的 Web 应用程序。 我一直在深入研究 Web 应用程序的安全部分,因此我希望生成自己的唯一会话 ID(使用加密算法并将其分配给用户登录后创建的每个新会话。

谁能指导我如何在会话中设置手动生成的会话 ID,并确保每个请求都传输会话 ID。

谢谢。

【问题讨论】:

为什么不使用容器为你生成的那个? @JB Nizet 纯粹出于安全原因,我的应用程序要求使用强加密算法手动生成会话 ID。请指导我如何设置会话 ID。 @McDowell 感谢您的回复。然而,实施 SPI 将有自己的优点和缺点,而且会有额外的负担来正确保护 SPI,并研究如何将容器特定 SPI 的功能与容器...我更多的是寻找一个强大的解决方案,而不是尝试实现一个容器 SPI..任何从 java 或 j2ee 角度来看的解决方案都将受到高度赞赏。 【参考方案1】:

我真的怀疑您会生成比容器生成的会话 ID 更安全的会话 ID,但您可以这样做,而无需使用任何特定于容器的扩展。

创建一个 servlet 过滤器来拦截对服务器的每个请求。

当一个请求进来时,检查这个请求是否已经存在一个会话(使用getSession(false))。如果存在,则从请求中提取您的特定 cookie MY_SESSION_ID,并将其值与存储在会话中的值进行比较。如果它们不匹配,则拒绝请求。

如果会话不存在,则创建它(使用getSession(true)),生成您的超级安全会话 ID,将其存储为会话属性并将 cookie MY_SESSION_ID 添加到响应中。

这具有自动创建会话的缺点,即使它不是严格需要的。但在使用组件框架的 JSP 时,大多数时候都是这种情况。

【讨论】:

我已经实现了一个过滤器,可以拦截我的所有请求。创建新会话或访问现有会话也已完成。但是,将超级安全会话 ID 存储在会话属性中并将 cookie MY_SESSION_ID 添加到响应中将绝对解决我的查询...【参考方案2】:

在 JSF 应用层尝试这样做是不可能成功的;我会在较低级别的 API 上执行此任务。我假设一个 servlet 容器。

我可以想到两种方法:

    通过特定于服务器的 SPI(如果存在的话)在容器级别执行此操作 通过 servlet Filter 重写请求/响应来做到这一点

没有足够的信息来评论第一种方法的可行性。

在第二个中,您必须确定会话 cookie 的名称(通常是 JSESSIONID,但不一定是)。您的 API 将:

    将过滤器映射到所有应用程序请求 维护容器会话 ID 到“安全”ID 的映射 使用过滤器重写请求中带有会话 id 的任何会话 cookie 使用过滤器重写具有安全 id 的响应中的任何会话 cookie 使用listener 从映射中删除无效会话以避免内存泄漏

【讨论】:

以上是关于在 JSF 中生成自己的会话 ID的主要内容,如果未能解决你的问题,请参考以下文章

为啥php每次在测试环境(WAMP)中生成相同的会话ID?

通过Zookeeper学习在分布式系统中生成全局唯一ID

分布式系统中生成全局ID的总结与思考

为啥不鼓励在 Java EE 容器中生成线程?

有没有办法在java中生成与字母组合的ID?

从 JSF 请求中检索会话 ID 值