1.简介
1.什么是cookie:cookie是一种能够让网站服务器把少量数据(4kb左右)存储到客户端的硬盘或内存。并且读可以取出来的一种技术。
2.当你浏览某网站时,由web服务器放置于你硬盘上的一个非常小的文本文件,它可以记录你的用户id、浏览过的网页或者停留的时间等网站想要你保存的信息。当你再次通过浏览器访问该网站时,浏览器会自动将属于该网站的cookie发送到服务器去,服务器通过读取cookie,得知你的相关信息,就可以做出相应的动作。比如,显示欢迎你的小标题,不用填写帐号密码直接登录等。。
3.不同的浏览器存储的cookie位置是也不一样的。cookie文件的信息是不安全的,所以cookie里面的数据最好加密。
4.浏览器保存cookie数据有2中形式:浏览器的内存中,浏览器所在的电脑硬盘中。
从本质上讲,它可以看作是你的身份证。但Cookies不能作为代码执行,也不会传送病毒,且为你所专有,并只能由提供它的服务器来读取。保存的信息片断以“名/值”对(name-value
pairs)的形式储存,一个“名/值”对仅仅是一条命名的数据。一个网站只能取得它放在你的电脑中的信息,它无法从其它的Cookies文件中取得信息,也无法得到你的电脑上的其它任何东西。(摘自网络)
并非所有浏览器都支持。数据信息是以文本的形式保存在客户端计算机。
2.Cookie的基本用法
(1) 将Cookie写入浏览器:
HttpCookie makeCookie = new HttpCookie("myCookie");//括号里面写的是Cookie的名称 3 makeCookie.Value = this.TextBox1.Text;//这个是Cookie的值 Response.Cookies.Add(makeCookie);//添加cookie变量
(2)读取Cookie的值
HttpCookie readCookie = Request.Cookies["myCookie"];//读取的是使用Request返回的值
2 TextBox2.Text = readCookie.Value;
(3)设置cookie的有效期
HttpCookie cookie = new HttpCookie("name","Elaine"); //创建cookie的实例。
cookie.Expires = DateTime.Now.AddDays();//设置cookie的过期时间,5天后过期,自动清除文件
Response.Cookies.Add(cookie);//将创建的cookie文件输入到浏览器端
Response.Write(Request.Cookies["name"].Value); //读取cookie文件中存储的值
(4)删除Cookie,没有特定的方法,只需要让它的有效期失效就行了
cookie.Expires = DateTime.Now.AddMonths(-); //cookie的销毁
(5)Cookie的其他属性
HttpCookie makecookie = new HttpCookie("myCookie"); 指定Cookie的名称:makecookie.Name; 指定Cookie的值: makecookie.Value; 指定Cookie的路径:makecookie.Path;
(6)Cookie加密
Response.Cookies["strPWD"].Value = FormsAuthentication.HashPasswordForStoringInConfigFile(加密字符串, "md5");
3.cookie读写原理
Cookies集合是附属于Response对象及Request对象的数据集合,使用时需要在前面加上Response或Request。
用于给客户机发送Cookies的语法通常为:
当给不存在的Cookies集合设置时,就会在客户机创建,如果该Cookies己存在,则会被代替。由于Cookies是作为HTTP传输的头信息的一部分发给客户机的,所以向客户机发送Cookies的代码一般放在发送给浏览器的HTML文件的标记之前。
如果用户要读取Cookies,则必须使用Request对象的Cookies集合,其使用方法是:
需要注意的是,只有在服务器未被下载任何数据给浏览器前,浏览器才能与Server进行Cookies集合的数据交换,一旦浏览器开始接收Server所下载的数据,Cookies的数据交换则停止,为了避免错误,要在程序和前面加上response.Buffer=True。
4.怎么查看Cookie的位置
打开IE》Internet选项》常规》
5.代码示例
案例一:
下面来完成一个登陆实例:
总共有两个页面,一个登陆页面,一个主页;
页面效果:
提示:
首先在登陆页前台的HTML代码里面的head标记里面的Title添加ID=”pageTitle
还有需要在web.config中把<appSettings/>改为以下结果:
<appSettings>
<!--
新添加的内容!
-->
<add key="WebTitle" value="Elaine00登陆实例"/>
<add key="MsgTitle" value="Elaine00登陆测试"/>
</appSettings>
具体代码:
登陆页:
前台:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CookieLogin.aspx.cs" Inherits="Cookie" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title id="PageTitle">登陆页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table style="width: 367px">
<tr>
<td colspan="" style="height: 17px">
用户登录</td>
</tr>
<tr>
<td colspan="" style="width: 116px; height: 18px">
登录名称:</td>
<td style="height: 18px">
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td colspan="" style="width: 116px">
密码:</td>
<td>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td colspan="" style="width: 116px">
</td>
<td>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="登录" />
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="重置" /></td>
</tr>
</table> </div>
</form>
</body>
</html>
后台:
using System;
using System.Web; public partial class Cookie : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
PageTitle.Text = System.Configuration.ConfigurationSettings.AppSettings["WebTitle"];
}
protected void Button1_Click(object sender, EventArgs e)
{
if (TextBox1.Text.Trim() != "" && TextBox2.Text.Trim() != "")
{
HttpCookie cookieAdminCode = new HttpCookie("CookAdminCode");
cookieAdminCode["AdminCode"] = TextBox1.Text;
cookieAdminCode["PWD"] = TextBox2.Text;
cookieAdminCode.Expires.AddDays(); Response.Cookies.Add(cookieAdminCode);
Response.Redirect("Main.aspx");
}
else
{
MessageBox("对不起,请输入用户名或者密码!");
}
}
#region MessageBox(string Message)
private void MessageBox(string Message)
{
string msgTitle = System.Configuration.ConfigurationSettings.AppSettings["MsgTitle"].Trim();
Response.Write("<script language=javascript>alert('" + msgTitle + "\\n\\n" + Message + "')</script>");//"\\n"一个斜线表示转义字符,一个表示于n在一起表示换行符号
}
#endregion
protected void Button2_Click(object sender, EventArgs e)
{
TextBox1.Text = TextBox2.Text = "";
}
}
主页:
前台:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Main.aspx.cs" Inherits="Main" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>主页</title>
</head>
<body>
<form id="form1" runat="server">
<div> </div>
</form>
</body>
</html>
后台:
using System;
using System.Web; public partial class Main : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
HttpCookie cookieAdminCode = Request.Cookies["CookAdminCode"];
string Adminname = cookieAdminCode.Values["AdminCode"].Trim();
string pwd = cookieAdminCode.Values["PWD"].Trim();
if (Adminname== "Elaine00" && pwd== "")
{
MessageBox("登录成功!");
Response.Write("欢迎" + Adminname + "登录本系统!您的密码是:" + pwd);
}
else
{
MessageBox("对不起!身份验证失败请重试!");
Response.Write("<script language=javascript>window.location.href='CookieLogin.aspx'</script>");
}
}
private void MessageBox(string Message)
{
// string msgTitle = System.Configuration.ConfigurationSettings.AppSettings["MsgTitle"].ToString().Trim();
string msgTitle = System.Configuration.ConfigurationManager.AppSettings["MsgTitle"].Trim();
Response.Write("<script language=javascript>alert('"+msgTitle+"\\n\\n"+Message+"')</script>");
}
}
案例二:
图示:
下面实现的是使用两个加密类来加密Cookie
首先定义一个EncryptString类;代码如下:
using System;
using System.IO;
using System.Security.Cryptography; namespace Test
{
public class EncryptString
{
private static byte[] Key64 = { , , , , , , , };
private static byte[] IV64 = { , , , , , , , };
private static byte[] Key192 = {, , , , , , , ,, ,
,, , , , ,, , , , , , , };
private static byte[] IV192 = {, , , , , , , ,,
, ,, , , , ,, , , , , , , };
public static String Encrypt(String valueString)
{
if (valueString != "")
{ //定义DES的Provider
DESCryptoServiceProvider desprovider =
new DESCryptoServiceProvider();
//定义内存流
MemoryStream memoryStream = new MemoryStream();
//定义加密流
CryptoStream cryptoStream = new CryptoStream(memoryStream,
desprovider.CreateEncryptor(Key64, IV64),
CryptoStreamMode.Write);
//定义写IO流
StreamWriter writerStream = new StreamWriter(cryptoStream);
//写入加密后的字符流
writerStream.Write(valueString);
writerStream.Flush();
cryptoStream.FlushFinalBlock();
memoryStream.Flush();
//返回加密后的字符串
return (Convert.ToBase64String(memoryStream.GetBuffer(), ,
(int)memoryStream.Length));
}
return (null);
}
public static String Decrypt(String valueString)
{
if (valueString != "")
{ //定义DES的Provider
DESCryptoServiceProvider desprovider =
new DESCryptoServiceProvider();
//转换解密的字符串为二进制
byte[] buffer = Convert.FromBase64String(valueString);
//定义内存流
MemoryStream memoryStream = new MemoryStream();
//定义加密流
CryptoStream cryptoStream = new CryptoStream(memoryStream,
desprovider.CreateEncryptor(Key64, IV64),
CryptoStreamMode.Read);
//定义读IO流
StreamReader readerStream = new StreamReader(cryptoStream);
//返回解密后的字符串
return (readerStream.ReadToEnd());
}
return (null);
}
public static String EncryptTripleDES(String valueString)
{
if (valueString != "")
{ //定义TripleDES的Provider
TripleDESCryptoServiceProvider triprovider =
new TripleDESCryptoServiceProvider();
//定义内存流
MemoryStream memoryStream = new MemoryStream();
//定义加密流
CryptoStream cryptoStream = new CryptoStream(memoryStream,
triprovider.CreateEncryptor(Key192, IV192),
CryptoStreamMode.Write);
//定义写IO流
StreamWriter writerStream = new StreamWriter(cryptoStream);
//写入加密后的字符流
writerStream.Write(valueString);
writerStream.Flush();
cryptoStream.FlushFinalBlock();
memoryStream.Flush();
//返回加密后的字符串
return (Convert.ToBase64String(memoryStream.GetBuffer(), ,
(int)memoryStream.Length));
}
return (null);
}
public static String DecryptTripleDES(String valueString)
{
if (valueString != "")
{ //定义TripleDES的Provider
TripleDESCryptoServiceProvider triprovider =
new TripleDESCryptoServiceProvider();
//转换解密的字符串为二进制
byte[] buffer = Convert.FromBase64String(valueString);
//定义内存流
MemoryStream memoryStream = new MemoryStream();
//定义加密流 CryptoStream cryptoStream = new CryptoStream(memoryStream,
triprovider.CreateEncryptor(Key64, IV64),
CryptoStreamMode.Read);
//定义读IO流
StreamReader readerStream = new StreamReader(cryptoStream);
//返回解密后的字符串
return (readerStream.ReadToEnd());
}
return (null);
}
}
}
再定义一个CookieEncrypt的加密类;代码如下:
using System;
using System.Web; namespace Test
{
public class CookieEncrypt
{
public static void SetCookie(HttpCookie cookie)
{ //设置Cookie
HttpContext.Current.Response.Cookies.Set(cookie);
}
public static void SetCookie(String key, String valueString)
{ //设置加密后的Cookie
key = HttpContext.Current.Server.UrlEncode(key);
valueString = HttpContext.Current.Server.UrlEncode(valueString);
HttpCookie cookie = new HttpCookie(key, valueString);
SetCookie(cookie);
}
public static void SetCookie(String key, String valueString,
DateTime expires)
{ //设置加密后的Cookie,并设置Cookie的有效时间
key = HttpContext.Current.Server.UrlEncode(key);
valueString = HttpContext.Current.Server.UrlEncode(valueString);
HttpCookie cookie = new HttpCookie(key, valueString);
cookie.Expires = expires;
SetCookie(cookie);
}
public static void SetTripleDESEncryptedCookie(String key,
String valueString)
{ //设置使用TripleDES加密后的Cookie
key = EncryptString.EncryptTripleDES(key);
valueString = EncryptString.EncryptTripleDES(valueString);
SetCookie(key, valueString);
}
public static void SetTripleDESEncryptedCookie(String key,
String valueString, DateTime expires)
{ //设置使用TripleDES加密后的Cookie,并设置Cookie的有效时间
key = EncryptString.EncryptTripleDES(key);
valueString = EncryptString.EncryptTripleDES(valueString);
SetCookie(key, valueString, expires);
} public static void SetEncryptedCookie(String key, String valueString)
{ //设置使用DES加密后的Cookie
key = EncryptString.Encrypt(key);
valueString = EncryptString.Encrypt(valueString);
SetCookie(key, valueString);
}
public static void SetEncryptedCookie(String key,
String valueString, DateTime expires)
{ //设置使用DES加密后的Cookie,并设置Cookie的有效时间
key = EncryptString.Encrypt(key);
valueString = EncryptString.Encrypt(valueString);
SetCookie(key, valueString, expires);
}
public static String GetTripleDESEncryptedCookieValue(String key)
{ //获取使用TripleDES解密后的Cookie
key = EncryptString.EncryptTripleDES(key);
String valueString = GetCookieValue(key);
valueString = EncryptString.DecryptTripleDES(valueString);
return (valueString);
}
public static String GetEncryptedCookieValue(String key)
{ //获取使用DES解密后的Cookie
key = EncryptString.Encrypt(key);
String valueString = GetCookieValue(key);
valueString = EncryptString.Decrypt(valueString);
return (valueString);
}
public static HttpCookie GetCookie(String key)
{ //通过关键字获取Cookie
key = HttpContext.Current.Server.UrlEncode(key);
return (HttpContext.Current.Request.Cookies.Get(key));
}
public static String GetCookieValue(String key)
{ //通过关键字获取Cookie的value
String valueString = GetCookie(key).Value;
valueString = HttpContext.Current.Server.UrlDecode(valueString);
return (valueString);
}
} }
接着定义Test.aspx页面;代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Test.Test" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
加密前的Cookie值:<asp:Label ID="myCookie" Runat="server"></asp:Label>
<br />
使用DES加密后的Cookie值:<asp:Label ID="EncryptCookie" Runat="server"></asp:Label>
<br />
使用TripleDES加密后的Cookie值:<asp:Label ID="TripleDESCookie" Runat="server"></asp:Label>
</div>
</form>
</body>
</html>
接着定义Test.aspx.cs代码:
using System;
using System.Web; namespace Test
{
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//调用函数EncryptMyCookies()获取Cookie的原始值和加密后的值
if (!Page.IsPostBack) { EncryptMyCookies(); }
}
//获取cookie的值加密前和加密后的值,并获取
private void EncryptMyCookies()
{
var myNameCookie = new HttpCookie("myName", "Elaine");
Response.Cookies.Add(myNameCookie);
//获取Cookie的原始值
var httpCookie = HttpContext.Current.Response.Cookies["myName"];
if (httpCookie != null)
myCookie.Text = httpCookie.Value; //获取使用DES加密后Cookie的值
EncryptCookie.Text = EncryptString.Encrypt(myCookie.Text); //获取使用TripleDES加密后Cookie的值
TripleDESCookie.Text = EncryptString.EncryptTripleDES(myCookie.Text);
}
}
}
小结:使用Cookie很方便,但是记得加密是重点~~