Cookie学习笔记
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很方便,但是记得加密是重点~~
Cookie学习笔记的更多相关文章
- Cookie学习笔记二:Cookie实例
今天说说刚刚学到的两个Cookie的最经典应用:自己主动登录和购物车设置 一:自己主动登录 须要两个页面:login.jsp与index.jsp,login.jsp用来输出登录信息,index.jsp ...
- 【转载】HTTP Cookie学习笔记
什么是cookie? cookie是什么?是饼干,小甜点? No! No! No! 我今天要总结的cookie并不是你所想的小甜心,我这里要说的cookie是Web开发中的一个重要的"武器& ...
- Session、Cookie 学习笔记
在开始今天的博文之前首先为自己庆祝一下自己有了三个粉丝,也有了同僚的评论,说实话因为这个开心了好久!哈哈,好了在开始今天的正题之前,首先大家需要了解以下几点: a. HTTP 协议是无状态的协议,WE ...
- [原创]java WEB学习笔记30:Cookie Demo 之显示最近浏览的记录
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记29:Cookie Demo 之自动登录
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Python3+Selenium3+webdriver学习笔记11(cookie处理)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...
- ASP.Net开发基础温故知新学习笔记
申明:本文是学习2014版ASP.Net视频教程的学习笔记,仅供本人复习之用,也没有发布到博客园首页. 一.一般处理程序基础 (1)表单提交注意点: ①GET通过URL,POST通过报文体: ②需在H ...
- python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容
python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖 ...
随机推荐
- 【CF819C】Mister B and Beacons on Field 数学
[CF819C]Mister B and Beacons on Field 题意:外星人盯上了Farmer Jack的农场!我们假设FJ的农场是一个二维直角坐标系,FJ的家在原点.外星人向FJ的农场上 ...
- Java虚拟机六 堆溢出的处理
在Java程序中,如果堆空间不足,有可能抛出内存溢出错误:Out Of Memory,简称OOM. Exception in thread "main" java.lang.Out ...
- php中属性和方法的修饰符
<?php class A{ private function do1(){ echo "do1 called"; } protected function do2(){ e ...
- PHP----实现压缩HTML
很多时候,我们在做优化处理的时候,会考虑压缩HTML,去掉HTML里面的空格和换行. 具体实现: public function change(){ echo "change"; ...
- Spring Framework框架容器核心源码逐步剖析
目录 构建Spring环境 Spring 版本 5.1.3.RELEASE 测试类 Spring 配置文件 测试方法Main 快速进入Debug查看IOC容器构建源码 Spring IOC源码步骤分析 ...
- hdu3974 Assign the task【线段树】
There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...
- 【转】C#中的Stream
C# 温故而知新:Stream篇(—) C# 温故而知新:Stream篇(二) C# 温故而知新:Stream篇(三) C# 温故而知新:Stream篇 (四) C# 温故而知新:Stream篇(五) ...
- WebFlux Spring Security配置
最小化可运行配置 package com.terwergreen.bugucms.config; import org.apache.commons.logging.Log; import org.a ...
- are not called implicitly
php.net <?php class BaseClass{ function __construct() { print "In BaseClass constructor<b ...
- hyperledger
http://hyperledger-fabric.readthedocs.io/en/latest/prereqs.html https://github.com/hyperledger/block ...