在 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的主要内容,如果未能解决你的问题,请参考以下文章