管理和区分Spring MVC中的并行会话

时间:2013-10-27 12:26:04

标签: spring session spring-mvc parallel-processing

问题是,我可以使用Spring或JS区分2个页面,在一个浏览器中并行打开。例如,我不想要一个情况

  1. 用户打开窗口1,其中包含一个选项列表,存储在会话中。
  2. 用户转到另一个页面并打开窗口2,其中包含相同名称的另一个选项列表,它们会覆盖会话中的选项
  3. 用户转到窗口1,使用窗口2中的选项提交表单,并从窗口1中丢失所有内容。
  4. 页面上没有登录或任何内容来帮助区分并行会话。 并且这是使这个工作在并行页面

    的原则

1 个答案:

答案 0 :(得分:1)

您可以为每个窗口使用不同的ID。此ID可能来自您表单中的隐藏字段,可以随机生成。


您首先在表单中添加一个隐藏字段,并保留此表单的唯一ID:

<input type="hidden" name="suffix" value="50bd324e7a" />

然后,您将此值用作来自此表单的所有变量的后缀。 会话密钥是字符串,因此为了设置/获取值,添加后缀没有问题。

使用您的方案,它会像这样:

  1. 用户打开窗口1,其中包含一个选项列表,存储在会话中。

    存储将后缀添加到密钥的数据,例如变量email将存储在会话变量email_50bd324e7a中。

  2. 用户转到另一个页面并打开窗口2,其中包含相同名称的另一个选项列表,它们会覆盖会话中的选项

    这里也是一样,但它是一个不同的形式,具有不同的id,因此变量名称会有所不同。

  3. 用户进入窗口1,使用窗口2中的选项提交表单,并从窗口1中丢失所有内容。

    在提交时,您读取隐藏字段的值并使用它从会话中获取数据。


  4. 另一种方法是直接使用那些唯一的id作为键,并在所有表单变量的键存储数组下使用。这个想法非常相似(也许代码会更干净)。

    E.g:

    标识为50bd324e7a的表单的所有变量都存储(作为映射)在名为50bd324e7a的会话变量中。所以为了获得例如表单变量email,您需要调用session.getAttribute(50bd324e7a)并从结果(地图)中获取键email的值。