APS.NET Cookie
cookie 提供了一种在 web 应用程序中存储用户特定信息(如历史记录或用户首选项)的方法。cookie 是一小段文本,伴随着请求和响应在 web 服务器和客户端之间来回传输。cookie 包含每次用户访问站点时可由 web 应用程序读取的信息。
1. 写cookie
管理客户端计算机上的 cookie。使用 httpresponse 对象可向客户端发送 cookie,该对象会公开称为 cookies 的属性。任何需要 web 应用程序发送到浏览器的 cookie 都必须添加到此集合中。编写新 cookie 时,必须指定 name 和 value。每个 cookie 必须有一个唯一的名称,这样在以后当浏览器随同请求发送 cookie 时,web 应用程序就可以标识该 cookie。
默认情况下,cookie 由位于同一域中的所有页面共享,但可以通过设置 cookie 的 path 属性将 cookie 限制在网站中的特定子文件夹。若要允许应用程序的所有文件夹中的所有页面都检索一个 cookie,请从应用程序根文件夹中的页面设置该 cookie,但不要设置 path 属性。
如果不指定该 cookie 的过期限制,则该 cookie 将不会保留在客户端计算机上,当用户会话到期时该 cookie 即到期。
cookie 仅能存储 string 类型的值。在将任何非字符串值存储到 cookie 中之前,必须将它们转换为字符串
httpcookie mycookie = new httpcookie("cooker"); mycookie["name"] = "zzh"; mycookie["today"] = "friday"; mycookie.expires = datetime.now.adddays(1); //mycookie.expires.adddays(1); response.cookies.add(mycookie); //response.appendcookie(mycookie); mycookie.domain = "abc.com"; //指定作用域abc.com和子域名如a.abc.com可用 mycookie.path = "/admin"; //只能用于 admin 文件夹或虚拟根目录中的页面
2. 读cookie
出于安全原因,您只能读取属于同一域的页所设置的 cookie。如果已设置 cookie 的 path 属性,则只有该域路径中的页和子文件夹能够使用该 cookie。
在读取特定 cookie 值时,请测试该 cookie 是否存在以及它是否具有值,否则将发生异常。
cookie 中的所有值都作为 string 类型存储,因此若要将 cookie 值作为其他数据类型使用,必须对值进行相应地转换。
if (request.cookies["cooker"] != null) { string cooker; if (request.cookies["cooker"]["name"] != null) { cooker = request.cookies["cooker"]["name"]; } }
3. 删cookie
不能直接删除用户计算机中的 cookie。但是,可以通过将 cookie 的到期日期设置为过去的日期,让用户的浏览器来删除 cookie。当用户下一次向设置该 cookie 的域或路径内的页发出请求时,浏览器将确定该 cookie 已到期并将其移除。
调用 cookies 集合的 remove 方法可从服务器端的集合中移除 cookie,使 cookie 不会被发送至客户端。但是,如果客户端已存在 cookie,则该方法无法从客户端将其移除。
if (request.cookies["cooker"] != null) { httpcookie mycookie = new httpcookie("cooker"); mycookie.expires = datetime.now.adddays(-1d); response.cookies.add(mycookie); }循环删
httpcookie acookie; string cookiename; int limit = request.cookies.count; for (int i=0; i
4. 改cookie
不能直接修改 cookie。更改 cookie 的过程涉及创建一个具有新值的新 cookie,然后将其发送到浏览器来覆盖客户端上的旧版本 cookie。下面的代码示例演示如何更改存储用户对站点的访问次数的 cookie 的值
int counter; if (request.cookies["counter"] == null) counter = 0; else { counter = int.parse(request.cookies["counter"].value); } counter++; response.cookies["counter"].value = counter.tostring(); response.cookies["counter"].expires = datetime.now.adddays(1);
5. cookie安全
不要将任何关键信息存储在 cookie 中。例如,不要将用户的密码存储在 cookie 中,即使是暂时存储也不要这样做。通常,不要将任何信息保存在 cookie 中,因为一旦它被假冒,就会危及您的应用程序的安全。而是在 cookie 中保存对信息在服务器上的位置的引用。
将 cookie 的过期日期设置为可接受的最短实际时间。尽可能避免使用永久 cookie。
考虑对 cookie 中的信息。
考虑将 cookie 的 secure 和 httponly 属性设置为 true。
cookie.secure=true 使 cookie 只能在使用安全套接字层 (ssl) 的连接上传输。ssl 并不能防止保存在用户计算机上的 cookie 被读取或操作,但可防止 cookie 在传输过程中被读取,因为 cookie 已被加密。;>