zoukankan      html  css  js  c++  java
  • 对ASP.NET Cookie的一些新的认识

    做用户登录,我一直用form验证的方式。有时候,为了节省时间,用户希望用户名输入框能够记住用户名,省得下次重新输入。这个时候光用form验证是不行的,因为form验证的话,用户一退出系统就失效了,所以需要借助于Cookie。

    本以为做这个会很轻松,谁知花了不少时间也没有成功。虽然检验用户名和密码都是正确的,但系统总是拒绝登录,然后返回到登录页面。登录页面的用户名输入框记是记住用户名了,但用户名是乱码的。

    真是郁闷至极!一度以为系统发生了错乱,重启机器也还是无济于事。经反复检查和测试发现,如果在form验证之前写入cookies,就会拒绝登录。这可能是asp.net出于安全考虑,发现了一个与from标识相同的cookies值,但是它没有明确地这样提示。

    解决这个问题的做法是,要先验证登录再把用户名写入cookies,这样就可以成功。
    System.Web.Security.FormsAuthentication.SetAuthCookie(UserName.Text,false);//登录...
    //将用户名写入cookies
    Response.Cookies["RememberMe"].Value = HttpUtility.UrlEncode(UserName.Text, System.Text.Encoding.GetEncoding("gb2312"));
    Response.Cookies[
    "RememberMe"].Expires = DateTime.Now.AddMonths(1);

    至于输入框的用户名显示为乱码是因为存储的是中文用户名,把中文字符写入cookies时,如果不做任何处理是会生产乱码的。解决方法是如上面红色代码所示,在写入的时候使用url编码,而且编码格式需要是中文格式的。在取得cookies值的时候做相应的解码即可:
    UserName.Text = HttpUtility.UrlDecode(Request.Cookies["RememberMe"].Value, System.Text.Encoding.GetEncoding("gb2312"));

    另一个问题是删除cookies,以前一直以为用Response.Cookies.Remove("RememberMe")可以删除,但就是没有效果。原来调用Cookies集合的 Remove 方法可从服务器端的集合中移除 Cookie,使 Cookie 不会被发送至客户端。但是,如果客户端已存在   Cookie,则该方法无法从客户端将其移除。 解决方法是,将 Cookie 的到期日期设置为过去的日期,让用户的浏览器来删除 Cookie:
    if (Response.Cookies["RememberMe"!= null) Response.Cookies["RememberMe"].Expires = DateTime.Now.AddDays(-1);//删除

    最后一个问题是创建浏览器进程的cookies(即关闭浏览器就会自动清空),创建方法相当简单,不要设置Expires属性就是默认的浏览器进程cookies。

    结尾附上关键部分的代码:
            System.Web.Security.FormsAuthentication.SetAuthCookie(UserName.Text,false);//登录,一定要先验证

            
    if (RememberMe.Checked)//再写入cookie
            {
                
    if (Request.Cookies["RememberMe"== null)
                {
                    Response.Cookies[
    "RememberMe"].Value = HttpUtility.UrlEncode(UserName.Text, System.Text.Encoding.GetEncoding("gb2312"));
                    Response.Cookies[
    "RememberMe"].Expires = DateTime.Now.AddMonths(1);
                }
            }
            
    else
            {
                
    if (Response.Cookies["RememberMe"!= null) Response.Cookies["RememberMe"].Expires = DateTime.Now.AddDays(-1);//删除
            }

    读取cookies值的时候:
            if (!IsPostBack)
            {
                
    if (Request.Cookies["RememberMe"!= null)
                {
                    UserName.Text 
    = HttpUtility.UrlDecode(Request.Cookies["RememberMe"].Value, System.Text.Encoding.GetEncoding("gb2312"));
                    RememberMe.Checked 
    = true;
                }
            }

     总结一下:

    1.写一个与form验证相同用户名的值到cookies中,应该先验证后写cookies,否则会产生冲突,导致验证不能通过。

    2.删除cookie的正确方法是设置已有cookies的日期为早于当前时间的日期,使用Cookies.Remove是没有效果的。

    3.创建浏览器进程的cookies,不要设置Expires属性就行了,这样关闭浏览器就会自动被清空

    4.cookies值是中文的时候最好用gb2312编码一下,这样可以避免产生乱码。

  • 相关阅读:
    【leetcode】1365. How Many Numbers Are Smaller Than the Current Number
    【leetcode】1363. Largest Multiple of Three
    【leetcode】1362. Closest Divisors
    【leetcode】1361. Validate Binary Tree Nodes
    【leetcode】1360. Number of Days Between Two Dates
    【leetcode】1359. Count All Valid Pickup and Delivery Options
    【leetcode】1357. Apply Discount Every n Orders
    【leetcode】1356. Sort Integers by The Number of 1 Bits
    ISE应用入门的一些问题
    DDR的型号问题
  • 原文地址:https://www.cnblogs.com/qingyun163/p/1621734.html
Copyright © 2011-2022 走看看