Asp.net mvc 会话和选项卡式浏览ASP.NETMVC

Asp.net mvc 会话和选项卡式浏览ASP.NETMVC,asp.net-mvc,session,url-rewriting,workflow-foundation-4,tabbed-browsing,Asp.net Mvc,Session,Url Rewriting,Workflow Foundation 4,Tabbed Browsing,我再次看到了标签浏览和会话的世界。看看谷歌的一些搜索,似乎没有一个好的方式来支持这一点 有没有人知道有一种方法可以在不窃取会话的情况下进行书签(无cookieless)(这在MVC2中不适用于DataAnnotation) 支持选项卡,使其符合每个用例(如Windows Workflow),同时执行两个工作流 我认为查询字符串中的url可能支持这一点,但我想知道是否有其他人也做过类似的实现 [编辑]用例:假设我正在编写一个使用类似Windows工作流的应用程序。每个UI工作流都可以执行一个操作,

我再次看到了标签浏览和会话的世界。看看谷歌的一些搜索,似乎没有一个好的方式来支持这一点

有没有人知道有一种方法可以在不窃取会话的情况下进行书签(无cookieless)(这在MVC2中不适用于DataAnnotation)

支持选项卡,使其符合每个用例(如Windows Workflow),同时执行两个工作流

我认为查询字符串中的url可能支持这一点,但我想知道是否有其他人也做过类似的实现

[编辑]用例:假设我正在编写一个使用类似Windows工作流的应用程序。每个UI工作流都可以执行一个操作,例如收集页面设置并执行一些外部流程。我可能希望同时执行其中两个工作流(不一定是同一个UI工作流)。因此,如果我在会话中保存,我将获得:

a) 不同的选项卡会干扰工作流 b) “上一个/下一个”按钮将非常难以设置,因为存在一个)

我希望这样,用户不能打开url的另一个选项卡(不要认为有100%的方法可以防止这种情况发生),或者允许用户单独使用UI工作流而不影响其他工作流(很像在两个不同的浏览器中运行两个工作流)

希望这能说明我正在尝试做什么

问候,,
J

您需要通过查询字符串或表单值以某种方式在客户端存储向导状态信息。正如您直觉所示,会话将不起作用。仅依赖于服务器上的内容的任何其他操作也不会发生。

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

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

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

目前,在浏览器中,您有选项卡A,位于问卷第2页的firstname=“Mark”,选项卡B位于问卷第2页的firstname=“Tom”。假设您希望在服务器上的会话中维护这两个,我认为这是一种适合您的方法

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

  • 在会话中使用随机数作为键“var questionaire=session[请求.表格[“questionaire\u rnumber”]]
  • 如果问卷不在会话中,您可以创建一个新的问卷,更新其属性并将其粘贴到会话中

    变量问卷=新问卷();
    questionaire.FirstName=Request.Form[“FirstName”]
    会议[请求表[“问卷号”]]=问卷

  • 如果问卷在会话中,您只需更新对象并显示下一页,但是,当您显示下一页时,您将希望再次在html中提供隐藏的随机数字段,使用与第1页相同的随机数

    通过这种方式,您可以在一个会话中保存任意数量的问卷。使用MVC.NET,您可以直接将随机数字段添加到视图模型中,并添加在会话中查找现有问卷或创建新问卷的逻辑,我认为您可以这样做

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

    安全和性能问题的一个例子是,攻击者意识到您的应用程序是这样工作的,攻击者请求表单第1页10000次,每次提交第1页。在该用户会话中,您将有10000个问卷对象。如果攻击者删除其会话ID cookie 10000次,并且他为第1页创建了10000个请求并提交了第1页表单,每个会话id cookie在服务器上的10000个会话中累积有100000个问询对象。因此,您还应该对其设置一些限制,以保护您的应用程序,例如:

  • 任何单个会话中只能有X个问题
  • 任何单个IP地址只能有Y个并发会话(这可能需要在应用程序对象中跟踪)
  • 对添加用例的额外响应

    谢谢您的使用案例。我的解决方案应该仍然适用于您。您有两个选择

    如果您希望确保只有一个选项卡与您的工作流一起工作,那么当随机数从新选项卡传递到服务器时,您将能够检测到有另一个正在进行的工作流,并且新选项卡中的随机数与第一个选项卡中的随机数不匹配,因此您将抛出异常并显示用户发送一些消息,告知他们在完成第一个工作流之前无法启动新工作流,并询问他们是否要取消第一个工作流。您必须询问他们是否要取消它,因为如果他们在启动的第一个工作流上关闭浏览器,他们将被卡住,直到会话过期。如果他们继续尝试启动工作流,则不会发生这种情况新的工作流程

    第二,您可以允许他们执行多个任务,但按照第一个答案中的建议,按随机数对每个工作流的上下文进行分段。关键是您在会话中创建了一些小型会话,但键入了一个仅存储的值