在JSF中生成自己的会话ID

时间:2011-10-19 06:36:19

标签: java session jsf java-ee jsf-2

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

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

感谢。

2 个答案:

答案 0 :(得分:2)

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

创建一个servlet过滤器,拦截每个请求到服务器。

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

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

这样做的缺点是自动创建会话,即使它不是严格需要的。但是大多数情况下使用组件框架的JSP就是这种情况。

答案 1 :(得分:1)

尝试在JSF应用程序层执行此操作不太可能成功;我会在较低级别的API上执行此任务。我假设一个servlet容器。

我可以想到两种方法:

  1. 通过服务器特定的SPI(如果存在的话)在容器级别执行此操作
  2. 通过servlet Filter
  3. 重写请求/响应来完成此操作

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

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

    1. 将过滤器映射到所有应用程序请求
    2. 将容器会话ID的映射维护为“安全”ID
    3. 使用过滤器使用会话ID
    4. 重写请求中的任何会话cookie
    5. 使用过滤器在安全ID
    6. 的响应中重写任何会话cookie
    7. 使用listener从地图中删除无效会话以避免内存泄漏