对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编码一下,这样可以避免产生乱码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值