【问题标题】:How can I achieve two different sessions for the same page?如何为同一页面实现两个不同的会话?
【发布时间】:2023-04-11 04:43:01
【问题描述】:

是否可以在不同选项卡中为同一页面创建不同的会话?假设我在一个标签中有这个 url https://www.test.com/test.aspx?id=123 和另一个标签有 https://www.test.com/test.aspx?id=124。每个都为其各自的 id 加载数据。如果我在第一个选项卡中执行某些操作以在 Session 中保存值,然后对第二个选项卡执行相同操作,如果我切换到第一个选项卡并进行 PostBack(例如调用保存信息的事件),则 Session 值从第二个选项卡将保存在第一个。我怎样才能避免这种情况?

【问题讨论】:

  • 除非您对会话管理方式进行一些自定义,否则这是不可能的。
  • @ChetanRanpariya 你能提供更多关于这种定制的信息吗?
  • 自定义需要为每个打开的新浏览器选项卡创建唯一的会话密钥。为此,浏览器需要向服务器发送一些信息,以便服务器可以为特定的浏览器选项卡使用适当的 sessionKey。整个方法将要求您编写服务器代码 (C#) 和客户端代码 (javascript),并且在实现此自定义时您会遇到许多其他用例。我建议重新评估您的设计,看看您是否可以避免使用会话...
  • 不是将其保存在 Session 变量中,也许 HiddenField 会起作用?检查元素时是否可以隐藏 HiddenField 中的值以不显示它(F12)?将其保存在会话中的原因是从浏览器检查时从 HiddenField 中显示该值。

标签: asp.net vb.net


【解决方案1】:

这是一个很大的痛苦 - 我希望有一个内置选项/设置可用。

但是,什么通常效果很好?

您可以使用会话将值传递到页面,但是一旦您进入该页面并加载第一页(Is PostBack = False),然后将少数传递的值传输/保存到 ViewState 中。 ViewState 与 Session() 一样简单和灵活,它是每个页面和每个选项卡的一组持久值。无论如何,如果您为此使用一堆隐藏字段控件,那也差不多。

所以,不要使用 session() 在页面上持久化值,而是使用 session() 来传递值。

所以现在,您可以打开多个页面 - 并且您只在第一页加载时抓取/使用 session() 来获取值 - 之后,您使用 ViewState 进行编码。现在你要小心,因为 viewstate 是基于浏览器端的——你不想重载它。 (在 ViewState 中放置大量数据 - 因为无论您在 ViewState 中拥有什么都会进行往返并存在于浏览器中 - 每个回发都会将此数据从客户端发送到服务器。

ViewState 也是 asp.net 管理所有控件的方式。因此,如果您有一堆文本框 - 并进行回发?您注意到这些控件值会自动为您保留。这适用于你的 asp.net 使用 Viewstate。即使您加载了两个相同的页面 - 您注意到文本框等仍然存在于每个页面。

Session() = 用于该用户的全局值类型 - 适用于所有页面。

ViewState() = 每页值。

因此,如果您使用 session() 将值传递到该页面 - 比如说一个新选项卡,然后在第一个页面加载时 - 将几个值传递给 ViewState。这些值现在是一个页面的本地值,并且不受其他打开的选项卡/页面的影响 - 即使页面在同一页面上。

【讨论】:

  • 谢谢。是否有可能我可以使用视图状态为该选项卡保存一个唯一 ID,然后围绕它建立一个会话,例如 Session("ViewState("uniqueid").ToString() + somestring")?
  • 有很多例子可以作为解决方案。但是话又说回来,由于所有代码都需要更改以使用该唯一 ID,因此对于几个 session() 值,您也可以只使用 viewstate。但是,是的,您可以生成一个唯一的 id,但是无论是原始页面,然后是目标页面,都必须处理并使用该 uniquieID。如果必须更改所有这些页面是否值得付出努力,而采用 session() 是针对全局用户值,而 viewstate 是针对每个页面的用户值,这有点值得商榷。
  • 问题就变成了如何生成新 ID。如果用户点击记住密码,那么启动新页面将不会触发登录代码,甚至不会触发新的 session() 事件代码。因此,通常仍然很难触发生成该新 ID 的代码。我想在首页登陆时,您可以生成该 ID,但话说回来,您是否可以始终控制该首页登陆以生成该 ID?或者也许您在页面加载时生成 ID,但现在我们回到使用 viewstate 的工作量减少了。
  • 好的,在这种情况下,我会选择使用 ViewState。如果信息是敏感信息,您是否仍建议使用 ViewState?
  • 好吧,viewstate 是加密的。很难惹。我承认 session() 当然更安全,而且只是服务器端。我的意思是,如果你有一些文本框、隐藏字段,甚至还有一个 gridview 显示?好吧,弄乱视图状态将允许人们更改这些值中的任何一个。如果这是一个敏感的 PK id 说一些客户数据,那么我认为生成的 ID,然后将敏感 ID 放入 session() 可以用于特殊情况。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多