2011-05-02 34 views
0

我有一个应用程序,当用户登录到应用程序时创建一个cookie。随后页面读取该cookie,并允许用户在这些页面上继续处理这些页面(cookie存在)。当我在IE 8.0上运行我的应用程序时,cookie会按照我的预期进行响应。当我通过VS2008运行我的应用程序时,cookie会按照我的预期进行响应。当我在Firefox 4.0中运行我的应用程序时,该Cookie在我的下一页上无效。处理IE和Firefox中的Cookie

这里是我的Cookie代码设置

protected void btnLogin_Click(object sender, EventArgs e) 
{ 
    if (CheckFields()) 
    { 
     string strSQL; 
     sqlUserInfo.SelectParameters.Clear(); 
     strSQL = "SELECT FirstName, LastName, Email FROM UserInfo WHERE [email protected] AND [email protected]"; 
     sqlUserInfo.SelectCommand = strSQL; 
     if (txtEmail.Text != "") 
     { 
      sqlUserInfo.SelectParameters.Add("email", txtEmail.Text); 
      sqlUserInfo.SelectParameters.Add("password", txtPassword.Text); 
      DataView dv = (DataView)sqlUserInfo.Select(DataSourceSelectArguments.Empty); 
      if (dv.Table.Rows.Count > 0) 
      { 
       string welcomeMsg = "Welcome back " + dv[0][0] + " " + dv[0][1] + "!"; 
       HttpCookie cookie = new HttpCookie("Email"); 
       cookie.Value = txtEmail.Text; 

       DateTime dtNow = DateTime.Now; 
       Response.Cookies.Add(cookie); 

       lblMenu.Text = welcomeMsg + "&nbsp;&nbsp;&nbsp; <a href='AcctInfo.aspx'>Update Account Info</a>&nbsp;&nbsp;&nbsp;<a href='TextAlerts.aspx'>Create/Update Text Alerts</a>&nbsp;&nbsp;&nbsp;<a href='graphSetup.aspx'>Graphing</a>"; 
       lblMessage.Text = ""; 
       btnLogin.Enabled = false; 
       btnLogoff.Enabled = true; 
      } 
      else 
      { 
       lblMessage.Text = "Login Unsuccessful"; 
      } 
     } 
    } 
} 

这里是我的代码在我的下一个页面的加载是acctinfo.aspx.cs

protected void Page_Load(object sender, EventArgs e) 
    { 
     cookie = Request.Cookies["Email"]; 
     if (cookie == null) 
     { 
      lblMessage.Text = "Not logged in. <a href='login.aspx'>Login</a>"; 
      lbLogoff.Visible = false; 
     } 
     else 
     { 
      EnableControls(); 
      string strSQL; 

      sqlUserInfo.SelectParameters.Clear(); 
      strSQL = "SELECT FirstName, LastName, Email, Password, PhoneNumber, Provider FROM UserInfo WHERE [email protected]"; 
      sqlUserInfo.SelectCommand = strSQL; 
      sqlUserInfo.SelectParameters.Add("email", cookie.Value.ToString()); 
      DataView dv = (DataView)sqlUserInfo.Select(DataSourceSelectArguments.Empty); 
      if (dv.Table.Rows.Count > 0) 
      { 
       oldPass = dv[0][3].ToString(); 
       oldPhone = dv[0][4].ToString(); 
       oldProvider = dv[0][5].ToString(); 
       if (!IsPostBack) 
       { 
        txtPassword.Text = oldPass; 
        txtPassword2.Text = oldPass; 
        txtPhone.Text = oldPhone; 
        lstProvider.SelectedValue = oldProvider; 
        strMenu = "Welcome " + dv[0][0].ToString() + " " + dv[0][1].ToString() + "&nbsp;&nbsp;&nbsp;<a href='TextAlerts.aspx'>Create/Update Text Alerts</a>&nbsp;&nbsp;&nbsp;<a href='graphSetup.aspx'>Graphing</a>&nbsp;&nbsp;&nbsp;"; 
        lblMenu.Text = strMenu; 
       } 
      } 
     } 
    } 

Cookies是在Firefox中启用,因为我可以从保存的文件中删除保存cookie的代码,将其放入单独的文件中,浏览该文件,然后浏览我的AcctInfo,并按预期工作。

任何帮助将不胜感激。

谢谢!

回答

1

使用Fiddler或其他HTTP观察家工具的代码,看看什么是真正从浏览器发送到/。代码本身看起来不错。

+0

我同意这一点。使用小提琴来查看发生了什么以及如何输出cookie。代码看起来很好。没有理由为什么它不应该工作 – 2011-05-02 23:38:13

+0

我安装了提琴手,这里是我注意到看结果。当我在IE上运行我的应用时,我得到了login.aspx的GET,然后设置了POST和cookie(在Response Headers部分中)。在FF中,我收到2个GET和1个POST,其中cookie被设置(在响应头中),然后GET(在请求头部cookie中设置),并在响应头中cookie已被清除。我不确定为什么会有多个GET发生,而IE只有1个? – TacticalTS 2011-05-03 14:30:48

+0

看起来像原始问题本身被解决为非问题:Cookie正常工作 - 由服务器设置POST响应,并通过浏览器发送下一个请求。服务器不应该在响应中重新发送cookie,除非您需要修改值并且有代码来执行此操作。 你需要弄清楚你的额外请求来自哪里,并可能提出新的问题。 (考虑在发布代码时创建更小的样本 - 您当前的样本包含大量与您无关的代码)。 – 2011-05-03 15:58:14

0

它看起来像你的cookie被设置为过期immeadiatly试试下面

HttpCookie cookie = new HttpCookie("Email"); 
     cookie.Value = txtEmail.Text; 

     DateTime dtNow = DateTime.Now; 
     cookie.Expires = DateTime.Now.AddYears(1); 
     Response.Cookies.Add(cookie); 
+0

Unlikly - 我没有看到在TacticalTS的示例中设置过期的代码...默认Cookie是会话Cookie - 因此在浏览器打开前不会过期。 – 2011-05-02 22:04:53

+0

@Alexei - 查看http://support.mozilla.com/en-US/questions/808831本质上,Firefox 4将永远不会记住Cookie信息,这是Firefox 4的新功能 – Johnv2020 2011-05-02 22:16:58

+0

有趣的是,我的设置为“记住历史记录”我不认为我曾经改变过它。但我的4.0升级了很多版本 - 可能是Firefox默认为“永远不会记得”干净安装。 @TacticalTS - 检查这个设置 - 可能是你的问题。同时让Cookie持久化而不是会话cookie不是必要的良好解决方案 - 考虑安全性与更改前需要的内容。 – 2011-05-02 22:46:22