代码之家  ›  专栏  ›  技术社区  ›  ace

绕过在多个选项卡窗口中共享的ASP.NET会话

  •  14
  • ace  · 技术社区  · 14 年前

    我在第一页的ASP.NET会话中存储了一些值。在下一页上,正在读取此会话值。但是,如果打开了多个选项卡,并且正在进行多页1->页2导航,则会话中存储的值会混淆,因为会话在浏览器选项卡之间共享。

    我想知道这方面有哪些选择:

    1. 查询字符串:使用查询字符串在页面之间传递值,我不想采用这种方法,因为在第1页上可以有多个锚标记链接到第2页,并且由于每个标记都是动态的,所以我不能重写它们的URL。

    2. 饼干????内存中的cookie也可以跨浏览器选项卡共享,与会话cookie相同,Rite?

    还有其他选择吗?

    附:第1页到第2页不是表单提交。

    6 回复  |  直到 7 年前
        1
  •  14
  •   radbyx Matt    7 年前

    我想出了一个解决办法:

    1. 使用javascript为浏览器窗口/选项卡分配一个唯一的ID,如guid 通过将guid值分配给 窗口名称 财产。window.name属性对每个浏览器窗口/选项卡都是唯一的,不会在窗口间共享。

    2. 使用guid作为键,通过WebService将数据读写到ASP.NET会话 . 因为javascript没有访问ASP.NET会话的权限,所以需要使用WebService并通过javascript调用它的方法。

    数据可以通过JSON在JavaScript和WebService之间传输。

        2
  •  7
  •   kervin    14 年前
    1. 给每个页面一个guid。将guid存储在隐藏字段中。
    2. 使用此guid作为会话键,存储该页的结构以及所有变量等。
    3. 现在,您可以提取特定页面“呈现”的信息,并将数据传递到会话结构,再传递到代码隐藏中的新“呈现”。

    这和 对象 自动执行。

    编辑

    评论回复

    我认为那不可能 作为 你描述过。

    在你的问题中,你提到了第1页到第2页 航行 . 如果用户在浏览器中键入第2页的URL,那么如何将当前的第2页呈现与上一页1关联起来?

    您需要做些什么,除非后面的代码可以搜索一个不完整的工作流列表,这些工作流已在第1页停止,并将其用作 前制导 新页2呈现的值。

    评论回复2

    您可以找到页面上的所有链接并修改这些链接,但这暗示出有问题(在我看来)。但是…

    http://www.extremeexperts.com/Net/Articles/LoopingthroughControls.aspx

    为您提供处理页面上所有控件的简单方法。您可以测试控件是否是超链接。不是所有的链接都需要 RunAT=服务器 为此而设置的参数。

        3
  •  3
  •   devuxer    14 年前

    你能用viewstate代替sessionstate吗?

    更新:

    或者是viewstate和sessionstate的组合。

    下面是一个示例序列:

    • 在第1页,用户选择“红色”。值存储在sessionstate中。
    • 用户导航到第2页。值从sessionstate读取并存储在第2页的viewstate中。
    • 用户在新选项卡中打开第二页1并选择“蓝色”。值存储在sessionstate中,因此“red”替换为“blue”。
    • 用户导航到第2页。同样,值从sessionstate中读取并存储在viewstate中。
    • 用户返回到原始页面2(第一个选项卡上的页面)并执行回发。从中读取值 对象 . 值仍为“红色”。
    • 用户返回第二页(第二个选项卡之一)并执行回发。从中读取值 对象 . 值仍为“蓝色”。

    换句话说,使用sessionstate 转变 页面之间。对同一页的回发使用ViewState。

    这有帮助吗?

        4
  •  1
  •   Patrick Karcher    14 年前

    听起来你希望每个页面都保持自己的值,彼此独立。

    • 如果 您可以使用post(例如:您可以避免在客户机上操纵URL)。 隐藏的输入标记 能做好这项工作。你肯定想把它封装起来,因为手工操作会很痛苦。否则:
    • 如果 你在用 对象 你可以用那个。否则:
    • 您可以得到值或ID(这会更好)。见下文)。 统一资源定位地址 . 最后一个办法,因为人类会搞砸的。或者当他们一周后回来的时候,他们可能会把它加入书签并引起混乱。

    如果无法将值发送到客户端 ,然后需要将“pagesessionid”或其他内容传递给客户机。这个ID要么是一个guid(如果安全性是一个问题的话更好),要么是一个以某种方式保证唯一性的值。以隐藏的输入标记或视图状态(如果没有其他选择,则为url)发送到客户机,并基于该ID在服务器上存储相关数据。

    曲奇对你来说是行不通的。

        5
  •  1
  •   Greg    14 年前

    另一种方法是使用服务器。传输或 CrossPagePostBack . 然后,您可以使用page.previous page访问上一页的所有变量。如果page.previouspage为空,那么您知道用户直接访问了该页,您应该在处理第2页时记住这一点。

    不过,我不能推荐它,因为使用server.transfer时,浏览器中的url不会更新,而crosspagepostback会使所有内容都回发,这会导致“后退”按钮无法正常工作等问题。

        6
  •  0
  •   Paul Mitchell    10 年前

    我正在设计一个这样的ASP.NET系统,允许一台或多台计算机上的多个页面、选项卡、会话,使用向导界面基于一个小的SQL记录树创建和编辑基于guid的键请求,因此这基本上是一个长时间运行的Web应用程序,它保存的数据只在用户提交时写入数据库。我们不希望同一数据由多个用户或选项卡编辑。

    我计划使用guid键创建/声明存储在appstate中的锁对象。lock对象还具有userid/timestamp/pagetoken。页面令牌是一个guid,但是如果为同一会话中的另一个页面预先创建了基于页面令牌的会话对象[这样可以将更多数据传递到新页面],或者可以对该令牌进行值化,则该令牌可以为当前页面创建会话对象。当基于键创建会话对象时,可以使用它存储普通会话类型的数据,该数据现在对此键是唯一的,而不是在整个会话中共享。

    因此,第一个页面在不带page token的应用程序状态下创建key对象,然后链接到新页面,该页面使用其querystring和key从app state中获取key对象,并通过将userid/timestamp/page token与null或值标记匹配。如果它匹配并且是一个空标记,则会在key对象和viewstate中创建和存储该标记。

    如果另一个页面具有与guid键匹配的相同查询字符串,则它可以尝试声明appstate键对象,但将失败,除非在从viewstate获取页面标记的键对象中具有相同的userid/timestamp/page token。如果一切都匹配,更新时间戳。如果时间戳太旧,15分钟后,密钥对象可能会被盗。如果旧页返回查找它,则页标记将不再匹配,并且声明将失败,因为时间戳太旧或页标记不匹配。

    创建键对象时,标记可以为空或值。如果它在创建时以空开头,那么任何人都可以用新的令牌声明,但必须与时间戳非常接近。

    然后,相关的键对象可以是更大的大小,在会话中使用页标记作为键存储到会话数据中,例如,在需要SQL备份存储的情况下,使用可序列化字典。

    因此,我们可以在整个Web应用程序中锁定所有用户的数据,我们可以在不使用15分钟后过期并重新获取这些锁,并为选项卡、页面、新会话和不同浏览器提供基于密钥的数据。