会话和选项卡式浏览ASP.Net MVC

时间:2010-12-15 12:48:00

标签: asp.net-mvc session url-rewriting workflow-foundation-4 tabbed-browsing

我再一次关注标签式浏览和Sessions的世界。查看一些谷歌搜索似乎没有一种很好的方式来支持这一点。

有没有人知道一种允许书签而不会窃取会话的方法(无cookie)(这在MVC2中不适用于数据注释)。

支持标签,使其符合每个用例(如Windows Workflow),一次完成两个工作流程。

我在想查询字符串中的url可能支持这个,但我想知道是否有其他人做过类似的实现。

[编辑]使用案例:假设我正在编写一个使用Windows Workflow之类的应用程序。每个UI工作流可以执行诸如收集页面的设置和执行一些外部过程的动作。我可能希望一次完成其中两个工作流程(不一定是相同的UI工作流程)。因此,如果我保存在会话中,我会得到:

a)不同的标签干扰工作流程 b)由于a),上一个/下一个按钮很难解决。

我也希望如此,用户无法打开另一个标签到网址(不要认为有100%的方法可以防止这种情况),或者允许用户孤立地使用UI工作流而不会影响另一个(就像在两个不同的浏览器中运行两个工作流程一样)。

希望这表明我正在尝试做什么。

此致 Ĵ

2 个答案:

答案 0 :(得分:2)

听起来您可能正在尝试执行以下操作:

例如,假设您有两页问卷,第一页上有第一个名字,第二页上有姓氏。您希望用户可以打开两个选项卡,并在问卷中的不同页面上,同时在每个选项卡的问卷中输入不同的数据。

因此,在标签A中,您已输入标记作为第一个名称并已提交,您现在位于标签A中的第二页。您决定要为您的朋友做一个问题,所以您打开一个新标签,选项卡B.在选项卡B中输入Tom并提交页面。

目前在浏览器中你有一个标签A,它位于问卷的第2页,第一个名字是“马克”,标签B位于第一个名字=“汤姆”的问卷第2页。假设您希望在服务器上保持这两个会话,这是一种我觉得适合您的方法。

当Web浏览器请求表单的第1页时,在GET请求中(没有向服务器发布问卷数据),您在响应html中提供隐藏字段并生成随机数以存储在该字段中。提交此表单时,请在服务器上执行以下操作:

  1. 使用随机数作为关键字查看会话“var questionaire = session [Request.Form [”questionaire_rnumber“]]
  2. 如果问卷未在会话中,您创建一个新的问卷并更新其属性并将其粘贴在会话中

    var questionaire = new Questionaire();
    questionaire.FirstName = Request.Form [“firstName”]
    session [Request.Form [“questionaire_rnumber”]] = questionaire;

  3. 如果问题在会话中你只是更新对象,并显示下一页,但是当你显示下一页时,你会想再次在html中提供隐藏的随机数字段,使用相同的随机数你在第1页上使用。

    这样您就可以在一个会话中容纳任意数量的问卷。使用MVC.NET,您可以直接向您的视图模型添加随机数字段,并添加逻辑以查找现有问卷的会话或创建新问号,我认为您将会很高兴。< / p>

    您应该记住该方法可能存在的问题,例如后退按钮问题,安全问题和性能问题。

    安全性和性能问题的一个示例是攻击者意识到您的应用程序是这样工作的,并且攻击者请求您的表单的第1页10,000次,并且每次都提交页面1。在一个用户会话中,您将拥有10,000个问题对象。如果攻击者删除了他的会话ID cookie 10,000次,并且对于每个会话id cookie,他创建了10,000个页面1请求并提交了第1页表单,那么在服务器上的10,000个会话中,您将累积100,000个问题对象。因此,您应该对其进行一些约束以保护您的应用程序,例如:

    1. 任何单个会话在会话中只能有X个问卷
    2. 任何单个IP地址只能有Y个并发会话(您可能需要在Application对象中跟踪)
    3. 加入使用案例的额外回应

      感谢用例。我的解决方案仍然适合您。你有两个选择。

      如果您想确保只有一个选项卡可以使用您的工作流程,那么当随机数从新选项卡传递到服务器时,您将能够检测到正在进行另一个工作流程以及随机数从新选项卡与第一个选项卡中的随机数不匹配,因此您将抛出异常并向用户显示一些消息,表示在完成第一个工作流之前无法启动新工作流,并询问他们是否要取消首先。您必须询问他们是否要取消它,因为如果他们在他们开始的第一个工作流程上关闭浏览器,他们将被阻塞直到他们的会话到期。如果他们继续尝试开始新的工作流程,这将不会发生。

      其次,你可以允许他们做多个,但是按照随机数对每个工作流的上下文进行分段,如第一个答案所示。重点在于您在会话中进行小型会话,但键入的值仅存储在客户端中。因此,当表单发布到服务器时,每个选项卡都有不同的随机数,因此很容易将该随机数与会话中的条目相关联,该条目包含从该选项卡启动的有关工作流的所有信息。

      希望这有帮助。

答案 1 :(得分:0)

您需要通过查询字符串或表单值以某种方式在客户端中存储向导状态信息。正如你所知,Session将工作。也不会仅仅依赖于服务器上的内容。