让我们看看,我会更详细地解释发生了什么。我有一个 texbox 和一个按钮;我想要的是在 texbox 中输入数据,当我点击按钮时,我被重定向到另一个页面,获取该 texbox 的值。为此,我登录到存储,然后在另一个窗口中重定向我并显示它。
这是我单击按钮时的编码图像。
现在要获取该会话的值并在 texbox 中显示它,我所做的是在 load() 中,就像我的 webform2 中的这段代码一样。
现在,当我运行应用程序时,我输入我的 webform1.aspx 并将名称放入 texbox:“name1”,如果它将我重定向到 webform2.aspx 并且如果显示我的“name1”。
现在的问题是,当我在另一个选项卡中打开并将 webform1.aspx 并将 name2 放置在 texbox 中时,如果我被定向到另一个页面并且如果我放置的第二个名称现在出现,我将返回到上一个选项卡并更新页面名称已更改,这就是问题所在。
怎么可能不改变或用什么方法替换会话?,因为我向您展示的内容很小,但根据我的问题,因为同样的事情发生在我的系统中,我想拥有放置的名称,想象一下用户登录并记录某些内容,可以使用他们登录的名字登录,但随后使用其他用户登录并记录所有内容。现在在会话中,它将被第二个用户而不是第一个用户捕获,这会导致问题。
这是 WebForm1 的代码
前端
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"/>
</div>
</form>
后端
protected void Button1_Click(object sender, EventArgs e)
{
Session["usuario"] = TextBox1.Text;
Response.Redirect("WebForm2.aspx");
}
Webform2 代码
前端
<form id="form1" runat="server">
<div>
<asp:Label ID="lbl1" runat="server" Text="Label"></asp:Label>
</div>
</form>
后端
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (Session["usuario"].ToString() == null)
{
Response.Redirect("WebForm1.aspx");
}
else
{
lbl1.Text = Session["usuario"].ToString();
}
}
}
问题是在输入登录时,您没有验证来知道用户是否已通过身份验证。
假设一旦用户通过身份验证,您将用户名保存在会话变量中
Session["AutenticatedUser"] = TxUsuario.Value.Trim().ToUpper();
(我建议使用已知名称,因为Session["0"]
只有您知道它们并且维护变得复杂,即使对您来说也是如此),那么在Page_Load
Login.aspx 中您应该有这样的内容:同样,当您注销用户时,您必须销毁会话变量,以便当他们进入登录名时,他们作为新用户进入。
注销.aspx 代码:
正如@Flxtr 评论的那样,您在检查用户是否已通过身份验证时遇到问题。在大多数需要日志记录的网站上,它们不允许您通过同一浏览器同时与两个或多个用户一起工作。如果这是您的情况,他们已经为您提供了一个很好的解决方案。另一个类似的选择是使用 cookie。
如果此解决方案不适合您的需求,因为无论出于何种原因,您需要能够在同一浏览器中与不同用户一起工作,您可以为每个用户动态创建会话名称。我给你举个例子:
假设我们有一个简单登录的网站。请求用户名和密码,在数据库中验证该用户是否存在,并根据响应,我们是否允许访问。
我突然想到您利用此查询从数据库中获取用户的唯一标识符代码并使用它来动态创建会话变量的名称:
因此,如果用户之前没有登录,请创建会话变量。如果它已经登录,我们什么也不做,因为会话变量已经存在。
但要使其工作,您还必须在整个应用程序中传播此 id(例如,您可以通过 url从登录表单将此 id 发送到主表单)。
任何一个
然后要再次检索用户名,您只需动态地重新创建会话变量的名称:
我希望我已经很好地解释了自己,并且对您有用。
根据您的说明进行编辑
如果我们稍微调整一下我给您的示例,我们可以将其调整为您想要的。我们将在您的 WebForm1的单击事件中进行此更改:
有了这个,我们要做的是为这个用户创建一个“唯一的会话变量”,然后我们通过 url 将名称发送到 WebForm2。
并且一旦在 WebForm2 中:
这样,在 WebForm2 中,我们检查是否通过 url 接收到值u并使用它来创建“单个会话变量”。如果它不存在,我们将它发送回 WebForm1.aspx。
也许这不是最正确的方法,因为简单地使用我们通过 url 收到的值u我们就有了名称,但作为一个例子来澄清一下它是好的。
此外,在示例中我也没有这样做,但我习惯于加密我通过 url 发送的每个参数。
检查您的会话是否为空,如下所示
我做同样的事情,我将用户 ID 保存在会话变量中,如果客户端想要保持会话启动,我也将其保存在 cookie 中,我也意识到你提到的情况,为此我做了最简单的事情,在登录时,正是在其onload事件中,我消除了会话变量,或者,如果失败,则消除 cookie,这样用户将无法在另一个会话持续的同时访问,因为前一个会话将在打开登录表单时已经关闭。