【问题标题】:ASP.net c# Avoid open the same window twiceASP.net c#避免两次打开同一个窗口
【发布时间】:2012-04-26 15:14:21
【问题描述】:

我正在开发一个网络应用程序。当用户在同一个会话中打开同一个窗口时,我对会话有一个小问题。

例如:现在,用户打开页面用户,他选择了一个用户用户我覆盖了会话值 (Session"["user"] = user).....

我正在考虑解决方案:

  • 避免用户在同一台​​电脑上打开同一个窗口
  • 为用户打开的每个页面创建唯一的 id

你怎么看? 哪个是更好的解决方案?

感谢您的帮助和问候,

【问题讨论】:

  • 你为什么在乎?如果用户打开两个选项卡来使用您的应用程序,而第二个选项卡替换了第一个选项卡使用的会话变量,那又如何?我不会尝试避免这种情况,这似乎是对网络应用的合理使用。
  • 我知道!但是用户从第一个选项卡更新数据,会话的值是第二个!
  • 你无法读出this
  • @EmmanuelN 我有点同意,除了第一个问题是“你觉得怎么样?”。我已经回答了这个问题。我想我也含蓄地回答了第二个问题:“哪个是更好的解决方案?”对我来说,这些解决方案都不是很好或比另一个更好。

标签: c# asp.net session window state


【解决方案1】:

我认为您无法阻止用户在两个不同的选项卡或浏览器中打开同一页面。 因此,如果您需要确保每个窗口在您的应用程序中都是一个不同的“会话”,您将需要某种唯一 ID,可能存储在隐藏的 HTML 输入中。

【讨论】:

    【解决方案2】:

    感谢大家的回复。

    我阅读了How to differ sessions in browser-tabs? 的帖子,并找到了几个解决方案来为每个标签生成唯一的 id。

    解决办法是:

    我将审查它们并告诉你结果。

    如果有人知道另一种解决方案,那就太好了!

    最好的问候,

    【讨论】:

      【解决方案3】:

      在这种情况下,您必须使用无 cookie 会话 - 在 system.web 中的 web.config 中

      <sessionState mode="InProc" timeout="20" cookieless="UseUri" />
      

      这样做是在 url 中插入一个会话 id,这样你就会得到类似 www.host.com/(abc15284dndhjkdm)/app.aspx 的内容。这对于每个标签都是唯一的,因此用户可以在每个标签上拥有唯一的会话。

      编辑:-这是我在下面提到的 web3.adprs.net/test/test1.aspx 上显示的 aspx 页面的代码

      Test1.aspx

      <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="test1.aspx.vb" Inherits="WebApplication4.test1" %>
      
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      
      <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server">
          <title></title> </head>
           <body>
              <form id="form1" runat="server">
              <div>
              Enter User <asp:TextBox ID="user" runat="server"></asp:TextBox>
              <asp:Button ID="go" runat="server" Text="Go" />
              </div>
              </form>
          </body></html>
      

      Test1.aspx.vb

      Public Class test1
          Inherits System.Web.UI.Page
      
          Private Sub go_Click(sender As Object, e As System.EventArgs) Handles go.Click
              Session("user") = user.Text
              Response.Redirect("test2.aspx")
          End Sub
      End Class
      

      Test2.aspx

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head runat="server">
          <title></title>
      </head>
      <body>
          <form id="form1" runat="server">
          <div>
          Your user from session is <%=Session("user").ToString%>
          </div>
          </form>
      </body>
      </html>
      

      web.config

      <?xml version="1.0"?>
      <configuration>
        <system.web>
          <compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
          <sessionState mode="InProc" timeout="20" cookieless="UseUri" />
        </system.web>
        <system.webServer>
           <modules runAllManagedModulesForAllRequests="true"/>
        </system.webServer>
      </configuration>
      

      HTH

      【讨论】:

      • 感谢您的回复。我刚刚检查过,但总是在 url 中输入相同的 id。
      • 您是否对 web.config 进行了更改 - 这是标准的 asp.net 功能我有许多站点,这些站点设置有成千上万的用户,其中许多用户将在单独的选项卡上登录,并且工作正常。如果您打开一个新选项卡到 www.site.com/main.aspx,它将看到您在 url 中没有会话令牌并发送重定向到 www.site.com/{uniqueid}/main.aspx。也许您正在将完整的网址复制并粘贴到新标签中,您应该只转到没有令牌的网址。
      • 是的,但是当我打开具有相同会话的同一页面时,唯一标识是相同的......
      • 抱歉 - 我不明白 - 你最初打开的是什么页面 url,你在第二个标签中打开了什么?正如我所说,这是微软为处理这种常见情况而制作的标准 asp.net 方法,因此它通常可以正常工作。
      • 我解释我的步骤,我进入我的应用程序,我用我的用户名和密码登录,在 url 我可以查看一个唯一的 id,然后我转到用户页面,然后我打开一个新标签,进入我的应用程序,转到用户(我已经登录)。我检查了标签的 ID,两者都是一样的!
      猜你喜欢
      • 1970-01-01
      • 2011-04-12
      • 2021-10-25
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多