做用户登录,我一直用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编码一下,这样可以避免产生乱码。

对ASP.NET Cookie的一些新的认识的更多相关文章

  1. ASP.NET Cookie(一)--基本应用

    Cookie提供了一种在Web应用程序中存储用户特定信息的方法.例如,当用户访问您的站点时,您可以使用Cookie存储用户首选项或其他信息.当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息 ...

  2. 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性

    [索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...

  3. ASP.NET Cookie 概述【转】

    来源:http://msdn.microsoft.com/zh-cn/library/ms178194(VS.80).aspx ASP.NET Cookie 概述 Cookie 提供了一种在 Web ...

  4. ASP.NET Cookie 概述

    什么是 Cookie? Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递.Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息. 例如,如果在用 ...

  5. 【转】asp.net Cookie值中文乱码问题解决方法

    来源:脚本之家.百度空间.网易博客 http://www.jb51.net/article/34055.htm http://hi.baidu.com/honfei http://tianminqia ...

  6. 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller

    原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...

  7. 返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model

    原文:返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model [索引页][源码下载] 返璞归真 asp.net mvc (8) - asp.net mvc ...

  8. 返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性

    原文:返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性 [索引页][源码下载] 返璞归真 asp.net mvc (12) - asp.net mvc ...

  9. 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

    原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...

随机推荐

  1. ios-滚动导航条页面

    // ViewController.m #import "ViewController.h" #import "ScrollSliderView.h" @int ...

  2. 【翻译】Kinect v2程序设计(C++) BodyIndex篇

    通过Kinect SDK v2预览版,取得BodyIndex(人体区域)的方法和示例代码. 上一节,介绍了从Kinect v2预览版用Kinect SDK v2预览版获取Depth数据的方法.   这 ...

  3. 大话数据结构(十)java程序——队列

    1.队列的定义 队列(queue):是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的线性表,简称FIFO(First out firts in).允许插入的一头是队尾 ...

  4. docker ubuntu

    DOCKER教程 注意事项 1.官方申明docker还是在开发完善中,不建议在运营的产品中使用它,但是现在离正式版越来越接近了,请关注我们的博客http://blog.docker.io/2013/0 ...

  5. mysql慢查询

    查看当前服务器是否开启慢查询: 1.快速办法,运行sql语句show VARIABLES like "%slow%" 2.直接去my.conf中查看. my.conf中的配置(放在 ...

  6. Prism&MEF构建开发框架 (三)

    菜单管控模块EntityFW 菜单的加载采用MEF技术,程序实现思路: 1 .主菜单加载页面MainMenuView.xaml指向MenuRegion 2. 菜单Item点击及内容加载,采用订阅模式, ...

  7. Cocos2d-JS目录说明

    frameworks---- 引擎所在,包含两个文件夹cocos2d-html5 和js-bindings.前者是html5引擎,后者是-x的引擎,外部接口是js写,但基础模块却是cpp来实现. sa ...

  8. yum安装node.js

    1.安装EPEL库 yum install epel-release 2.安装Node.js yum install nodejs 3.安装nodejs中常用的npm软件包管理器 yum instal ...

  9. Magento 安装时文件权限 设置

    http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/magento_filesystem_permission ...

  10. [LeetCode]题解(python):110 Balanced Binary Tree

    题目来源 https://leetcode.com/problems/balanced-binary-tree/ Given a binary tree, determine if it is hei ...