界面上有一个用户名文本框和一个密码文本框,还有个记住密码复选框。一个登录按钮。
请问,记住密码功能怎么实现?
别人的建议:当勾选复选框时,把用户名和密码存储在一个xml文件中;当取消勾选时,把xml删除。这样在登录窗体启动的时候,看看有没有xml文件就可以了(有,则把xml文件中的用户名读到界面上;没有,则登录窗体的用户名和密码为空)。
我觉得这样做不是太好。把用户名和密码都暴露在文件中,不是个好的选择。不知这个问题,怎么处理才好。如果真的要写到一个xml文件中,请问怎么创建xml文件及它的元素,怎么读取xml中对应的元素。xml文件形式如下:
<logininfo>
   <name>admin</name>
   <password>admin</password>
</logininfo>

解决方案 »

  1.   

    cookie能实现,winForm的TextBox没有这个功能吗~!好像有联想功能~!
      

  2.   

    可以用文件流写啊。。
    string context="<logininfo>\r\n <name>{0}</name> \r\n  <password>{1} </password>\r\n </logininfo>";
    context= string.Format(context,"admin","admin");
    FileStream stream = new FileStream(@"c:\login.xml");
    StreamWriter w = new StreamWriter(stream);
    w.Write(context);
    stream.Dispose();
      

  3.   

    http://blog.csdn.net/zhangjianjianjianjia/archive/2009/11/06/4776397.aspx
      

  4.   

    如果真的要写到一个xml文件中,请问怎么创建xml文件及它的元素,怎么读取xml中对应的元素。
    ==
    这个并不难,使用System.XML命名空间相应的类即可可参考"使用XmlTextWriter与XmlTextReader访问创建和读取XML文件"
    http://blog.csdn.net/amandag/archive/2008/07/08/2623320.aspx但使用这种机制的话,客户端很容易得到真实的用户名和密码,建议将其加密。其他的思路也可以考虑如果用户勾选复选框时,想办法得到用户的一些物理信息(如网卡MAC地址),以后此地址可直接登录
      

  5.   


    创建:
    //执行linq添加(xmlLOG)
                XElement newLog = new XElement("logininfo"
                                      , new XElement("name", "admin")
                                      , new XElement("password", "admin")
                                  );
                //保存xml
                newLog.Save(xmlPath);
    读取:XmlNode xn = xmlDoc.SelectSingleNode("logininfo");            XmlNodeList xnl = xn.ChildNodes;            foreach (XmlNode xnf in xnl)
                {
                    XmlNodeList xnf1 = xe.ChildNodes;
                    foreach (XmlNode xn2 in xnf1)
                    {
                        Console.WriteLine(xn2.InnerText);//显示子节点点文本
                    }
                }     
                Console.ReadKey();
      

  6.   

    简单加一下密再保存在XML文件中
    或者用二进制写文件,别人打开看到也是乱码
      

  7.   

    xml或者cookie  注意点就一个 加密或者掩码
    不要让名码暴露在文件中
      

  8.   

    可以将存储信息编码了再存,比如BASE64编码,还有就是不一定要存到XML里那么工整的告诉别人这死什么,直接拼一个自己知道怎么拆解的字符串,然后写到一个文本文件里就行了比如string sparator = ((char)0x1f).ToString();
    string[] info = new string[] { Convert.ToBase64String(Encoding.Default.GetBytes(name)), Convert.ToBase64String(Encoding.Default.GetBytes(password)) };
    File.WriteAllText(savePath, string.Join(sparator, info));
      

  9.   

    不管XML 还是 自定义文件存储!安全与否,主要取决你的加密算法!
    private string accountFilePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +"\\accounts.dat ";private IDictionary<string, string> accounts = new SortedList<string, string>();/// <summary>
            /// 记住密码
            /// </summary>
            private void ReloadAccounts()
            {
                this.txtUserName.AutoCompleteCustomSource.Clear();
                accounts.Clear();
                if (!File.Exists(accountFilePath))
                {
                    return;
                }
                using (StreamReader reader = new StreamReader(accountFilePath))
                {
                    while (true)
                    {
                        string username = reader.ReadLine();
                        if (string.IsNullOrEmpty(username)) break;
                        string password = reader.ReadLine();
                        if (string.IsNullOrEmpty(password)) break;
                        accounts.Add(username, password);
                        txtUserName.AutoCompleteCustomSource.Add(username);
                    }
                }
            }/// <summary>
            /// 登录事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnLogin_Click(object sender, EventArgs e)
            {
                if (accounts.ContainsKey(this.txtUserName.Text))
                {
                    accounts[this.txtUserName.Text] = this.txtUserPass.Text;
                }
                else
                {
                    accounts.Add(this.txtUserName.Text, this.txtUserPass.Text);
                }            using (StreamWriter writer = new StreamWriter(accountFilePath))
                {
                    foreach (KeyValuePair<string, string> account in accounts)
                    {
                        writer.WriteLine(account.Key);
                        writer.WriteLine(account.Value);
                    }
                }            ReloadAccounts();            string user = this.txtUserName.Text.Trim();  
                //加密
                string bbb = Crypto.EncryptData("jm", this.txtUserPass.Text.Trim());
                string pwd = bbb;            string filter = "username='" + user + "'" + " and password='" + pwd + "'";            DataTable loginTable = manager.selectAll("userlist", "*", filter);            if (this.txtUserName.Text.Trim() == "" || bbb == "")
                {
                    MessageBox.Show("用户名或密码不能为空!");
                    this.txtUserName.Focus();
                }
                else if (loginTable.Rows.Count == 0)
                {
                    MessageBox.Show("用户名或密码错误!");
                    this.txtUserName.Focus();
                }
                else
                {
                    MessageBox.Show("登录成功!");            }
            }          //当鼠标离开用户名时自动获得密码
            private void txtUserName_Leave(object sender, EventArgs e)
            {
                string password = string.Empty;
                if (accounts.TryGetValue(this.txtUserName.Text, out password))
                    this.txtUserPass.Text = password;
            }
      

  10.   


    DataTable loginTable = manager.selectAll("userlist", "*", filter);
    中的manager是上下文都没有,请问指什么?