2

我有一个 asp.net c# web 应用程序,用户可以登录并查看他上周的日程安排,该日程安排存储在远程数据库中。登录该站点只需执行 SQL 检查,以查看用户名和密码是否与数据库中的 uname 和 pass 记录匹配。登录后,他们可以操作时间表的时间条目等。在调试时,我以两个不同的用户身份登录。用户 B 的表单上有用户 A 的所有内容。我编写程序就像编写常规的 c# 应用程序一样,并没有真正考虑过同时使用该网站的多人。我想我认为实例处理是自动的?我只使用asp.net 一个星期左右,并没有太多的支持。

我的主要问题是,如果我的网站上同时有多个用户,我如何保持他们的会话分开?


更新 - 添加会话变量后

这是我获取用户信息的sql语句。现在,使用会话变量:

string sqlquery = "SELECT FirstName, LastName, OperatorID FROM operators WHERE EmpID = '" + sql + "'";
        using (MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["EobrConnectionString"].ConnectionString))
        {
            conn.Open();
            using (MySqlCommand comm = new MySqlCommand(sqlquery, conn))
            {
                using (MySqlDataAdapter adapter = new MySqlDataAdapter(comm))
                {
                    DataTable dt = new DataTable();
                    adapter.Fill(dt);
                    foreach (DataRow dr in dt.Rows)
                    {
                        Session["Fname"] = dr[1].ToString();
                        Session["Lname"] = dr[2].ToString();
                        Session["opID"] = dr[3].ToString();
                     }
                }
            }
        }

在主菜单页面中,我有这个:

protected void Page_Load(object sender, EventArgs e)
{
    firstname = Session["Fname"].ToString();
    lastname = Session["Lname"].ToString();
    lblwelcome.Text = "Welcome, " + firstname + " " + lastname + ", make your selection below.";
}

当用户 A 登录时,他们会看到自己的名字“Frank Drebbin”。当用户 B 登录时,他们会看到自己的名字“Jake Gaston”。但是现在,如果我重新加载第一个用户页面,他们会看到名称为“Jake Gaston”。

4

4 回答 4

5

您需要使用单独的浏览器。您正在使用会话来识别用户,并且会话与浏览器中的 cookie 相匹配 根据您上面的评论,会发生以下情况

以 steve 身份登录 -> 会话已创建 -> steve 以用户名存储 -> cookie 返回到浏览器

在新窗口中,以 frank 登录 -> 会话已存在,将用户名重命名为 frank。

在第一个窗口刷新。-> 会话用户名没有坦率 -> 根据该用户名返回数据。

新的 IE 窗口都共享相同的上下文。这意味着如果 1 个窗口获得 cookie,它们都会获得。有两种方法可以解决这个问题(实际上是 3 种)。

  • 使用物理上不同的机器
  • 使用 2 个浏览器,例如 IE & Firefox
  • 在 IE 中按 alt 获取菜单,然后从文件菜单中单击新会话。这会形成一个物理上独立的窗口,不会共享 cookie(尽管没有任何东西可以向您表明这一点)

完成上述操作后,再次尝试以 Steve 和 Frank 的身份登录,您应该会看到他们不会相互干扰。

于 2012-05-23T18:13:32.667 回答
2

我猜问题是,虽然会话是分开保存的(你在会话中存储东西,对吗?),从数据库加载数据的查询没有考虑用户名。

查看加载任务的 SQL 查询,看看您是否在该查询中包含用户名(或用户 ID)。如果您需要帮助查看它,请随时发布查询。

因此,要直接回答您的主要问题,如果您将内容存储在 Session 中,它们将与其他会话正确隔离。但是,错误的数据输入,错误的数据输出。

于 2012-05-23T16:45:41.197 回答
0

编辑: 使用另一个浏览器来测试这个,你不能在另一个选项卡中使用相同的浏览器,或者在另一个窗口中使用相同的浏览器,它几乎将是同一个会话

如果您使用“会话”来保存用户的数据,那么它们是分开的,这意味着您应该将任何每个用户的数据存储到“会话”或 cookie 中。

注意:您应该保持并发http://msdn.microsoft.com/en-us/library/cs6hb8k4(v=vs.80).aspx

于 2012-05-23T16:47:38.767 回答
0

解决方案非常简单(用户不同的浏览器 SIMONTANIOUSLY),如 IE、Firefox、Chrome 等......

您没有使用事务 SQL,因此需要担心并发性,

但是当你登录当前浏览器时,如果你使用同一个浏览器,它仍然会创建一个会话,

如果您使用其他浏览器,浏览器将拥有会话,但值不会相同。

例如

如果您有 100 部手机,现在每部手机都有不同的浏览器,这意味着您可以存储 100 个相同的USER会话,但所有手机的值都会因您提供的数据或操作句柄而异。

希望这可以帮助您理解。

于 2015-06-14T07:42:53.837 回答