关于Cookies与Session系列一

这两个东西,最近项目操作的比较少,不过这两个在Web项目开发中一直都扮演着很重要的角色,有时有些细节会不小心就遗忘掉。

                    Cookies 
的概述

Cookies是由服务器端生成,发送给客户端,用来保存一些数据文本文件。在用户进行网页浏览时,这家伙会在客户端与服务器之前传递,常用作身份的验证、用户会话识别或存储小型数据。由于cookies是保存在客户端,那么就意味着用户可以修改和读取,因此有人利用木马、病毒窃取用户Cookies并获得用户信息,所以,作为开发人员,Cookies不适合保存重要或者涉及隐私的内容,除非你加密。(当然,作为用户,定期清理这些垃圾是一个好习惯~)

 

                    Cookies 的限制

大多数浏览器支持最大为4096个字节的Cookie,所以Cookie不适合保存大数据。
浏览器也会限制同一个站点下的Cookies数量,一般为20个,超出这个数量的话,旧的Cookie将会被丢弃。
用户可以禁用Cookie,如果禁用后会影响Session的信息保存(相关问题在后续会讲到)

                    Cookies 
的操作

由System.Web.HttpCookie中可以看到.net 提供的Cookie的属性及方法

// 摘要:
// 提供创建和操作各 HTTP Cookie 的类型安全方法。
public sealed class HttpCookie
{
// 摘要:
// 创建并命名新的 Cookie。
//
// 参数:
// name:
// 新 Cookie 的名称。
public HttpCookie(string name);
//
// 摘要:
// 创建和命名新的 Cookie,并为其赋值。
//
// 参数:
// name:
// 新 Cookie 的名称。
//
// value:
// 新 Cookie 的值。
public HttpCookie(string name, string value);

// 摘要:
// 获取或设置将此 Cookie 与其关联的域。
//
// 返回结果:
// 要将此 Cookie 与其关联的域名。默认值为当前域。
public string Domain { get; set; }
//
// 摘要:
// 获取或设置此 Cookie 的过期日期和时间。
//
// 返回结果:
// 此 Cookie 的过期时间(在客户端)。
public DateTime Expires { get; set; }
//
// 摘要:
// 获取一个值,通过该值指示 Cookie 是否具有子键。
//
// 返回结果:
// 如果 Cookie 具有子键,则为 true;否则为 false。默认为 false。
public bool HasKeys { get; }
//
// 摘要:
// 获取或设置一个值,该值指定 Cookie 是否可通过客户端脚本访问。
//
// 返回结果:
// 如果 Cookie 具有 HttpOnly 属性且不能通过客户端脚本访问,则为 true;否则为 false。默认值为 false。
public bool HttpOnly { get; set; }
//
// 摘要:
// 获取或设置 Cookie 的名称。
//
// 返回结果:
// 除非构造函数另外指定,否则默认值为 null 引用(在 Visual Basic 中为 Nothing)。
public string Name { get; set; }
//
// 摘要:
// 获取或设置要与当前 Cookie 一起传输的虚拟路径。
//
// 返回结果:
// 要与此 Cookie 一起传输的虚拟路径。默认值为当前请求的路径。
public string Path { get; set; }
//
// 摘要:
// 获取或设置一个值,该值指示是否使用安全套接字层 (SSL)(即仅通过 HTTPS)传输 Cookie。
//
// 返回结果:
// 如果通过 SSL 连接 (HTTPS) 传输 Cookie,则为 true;否则为 false。默认为 false。
public bool Secure { get; set; }
//
// 摘要:
// 获取或设置单个 Cookie 值。
//
// 返回结果:
// Cookie 的值。默认值为 null 引用(在 Visual Basic 中为 Nothing)。
public string Value { get; set; }
//
// 摘要:
// 获取单个 Cookie 对象所包含的键值对的集合。
//
// 返回结果:
// Cookie 值的集合。
public NameValueCollection Values { get; }

// 摘要:
// 获取 System.Web.HttpCookie.Values 属性的快捷方式。此属性是为了与以前的 Active Server Pages (ASP)
// 版本兼容而提供的。
//
// 参数:
// key:
// Cookie 值的键(索引)。
//
// 返回结果:
// Cookie 值。
public string this[string key] { get; set; }

System.Web.HttpCookie(System.Web.dll,
v4.0.0.0)

简单的操作如下


public ActionResult Index()
{
var cookie = new HttpCookie("MyCookieName", "string value");
//简单的Cookie
Response.Cookies.Add(cookie);

var testCookies = new HttpCookie("MyCookiesInfo");
//默认属性
testCookies.Value = "丰富的Cookies";
//TestCookies.Domain = "testlocalhost";默认为当前网站跟域,如localhost,但如果你想设置域为testlocalhost,嘻嘻,自己试试
testCookies.Name = "123456"; //这里重置了该Cookies的名称,改为123456
//额外的属性
testCookies["TestAttr1"] = "再来个属性";
testCookies["TestAttr2"] = "再来个属性2";
//设置超时时间
testCookies.Expires = DateTime.Now.AddHours(1);
Response.Cookies.Add(testCookies);
return View();
}

public ActionResult About()
{
string test = Request.Cookies["MyCookieName"].Value;
string test2 = Request.Cookies["123456"].Value;
string test3 = Request.Cookies["123456"]["TestAttr1"];
Response.Write(test + "|" + test2 + "|" + test3 + "|" + Request.Cookies["123456"].Expires.ToString());
return View();
}

 
About页面输出的结果是 “string value|丰富的Cookies&TestAttr1=再来个属性&TestAttr2=再来个属性2|再来个属性|0001/1/1 0:00:00 ­­”

这里可以看到一个cookie操作的特性
当浏览器向服务器发送 Cookie 信息时,并不包括有效期信息。(Cookie 的 Expires 属性始终返回值为 0 的日期时间值。)
即服务器不能获取cookie的有效时间来判断cookie是否已经过期。
那我们能不能改变cookie的有效时间让它提前过期呢?我们修改About的代码如下


           string test = Request.Cookies["MyCookieName"].Value;

            Request.Cookies["MyCookieName"].Value = "我要修改属性啦!";
            Response.Cookies["MyCookieName"].Expires = DateTime.Now.AddDays(-1);

            string test2 = Request.Cookies["123456"].Value;
            string test3 = Request.Cookies["123456"]["TestAttr1"];
          
            Request.Cookies["123456"].Value = "我要修改属性啦!";


在执行Index时,cookie信息如下

到About页面时

只剩下123456这个cookie了,因为我们设置MyCookieName的超时时间比当前时间小,因此客户端自动将这个cookie删除了。

但请注意,123456的cookie值没有改变!!为什么??别急,我们先来看看我们在操作上述代码时,客户端与服务端是怎么沟通的?对,Http协议。

Http协议的详细内容就不在这啰嗦了,请去找度娘(屌丝程序员的最爱)。研究协议的最好方法还是抓包,抓包工具很多,以后应该会针对http协议有一篇总结,到时再详细说吧。

以下是请求Index时的一个抓包的部分截图

我们可以看到,服务端在HTTP的响应头中通过【Set-Cookie】的响应头来进行Cookie的设置
那么我们在访问About时,抓包截图如下


可以看到产生了一个【Set-Cookie】的响应头,将MyCookieName的Expires时间改变了(比较123456的Expires即可知MyCookieName的Expires变得比当前时间小,故删除操作是客户端自己完成的),因此,客户端就只剩下123456这个cookie了,那为什么123456的值没有改变呢?怎么改变呢?我们再来修改About的代码,增加如下代码

          var temp = new HttpCookie("123456");
temp = Request.Cookies["123456"];
temp["TestAttr1"] = "真的要改变属性值啦!";
Response.Cookies.Add(temp);

然后重新由Index页面跳转到About页面

抓包截图为

没错,这样才会产生一个【Set-Cookie】的响应头
因此操作cookie的另外一个特性为
服务端不能直接改变客户端的cookie值,包括超时时间也不能直接修改,需要重新建立一个对应名称的Cookie,然后重新对该Cookie下的的属性赋值,再添加到httpContext中,
超时时间也一样,只能重写
虽然修改不了Cookie,但可以取得,那服务端是如何拿到客户端的Cookie信息呢?
细心的朋友发现了刚才抓包截图中左侧为客户端请求头,很明显客户端(浏览器)在每次请求时会把cookie信息装进请求头中,这里还需要注意一点,我们保存在浏览器上的cookie非常多,难道每次请求都会把所有的cookie放到请求头去么?答案是否定的。
浏览器会检查当前要请求的域名以及目录, 只要这二项目与Cookie对应的Domain和Path匹配,才会发送。对于Domain则是按照尾部匹配的原则进行的。
 
最后补充一下和Cookie相关的一些操作
校验浏览器是否支持Cookies,不支持时可以提示用户


    if (Request.Browser.Cookies)
{
//浏览器支持cookies,继续coding......
}
else
{
//浏览器不支持cookies,那么弹出提示信息或者重定向到新页面进行处理
}

Js也能操作Cookies的,简单的例子如下


<script type="text/javascript">
function WriteCookie() {
var cookie = "cookie_js=22222222; path=/";
document.cookie = cookie;
}
function ReadCookie() {
alert(document.cookie);
}
</script>

读取的效果为

如果想对读取结果进行解析,请自行处理一下。

写的效果为



在前面的代码中,如果你设置 TestCookies.Domain = "testlocalhost" 该cookie将不会被创建,大家能说说是什么原因么?

关于Cookies与Session系列一,布布扣,bubuko.com

时间: 2025-01-03 19:46:51

关于Cookies与Session系列一的相关文章

django中的cookies和session机制

0.概述 (1)为什么要有cookies和session 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.而在现实网站中,那淘宝网来举例,用户将商品加入购物车和用户付款是不同的请求,但这个这连个请求需要是同一个用户,而这样的使用场景很多.总结来说,cookies和session一种用户识别用户身份的解决方案. (2)cookies 第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用

asp.net网站防恶意刷新的Cookies与Session解决方法

本文实例讲述了asp.net网站防恶意刷新的Cookies与Session解决方法,是WEB程序设计中非常实用的技巧.分享给大家供大家参考.具体实现方法如下: Session版实现方法: public double time; public const int freetime = 1;//防刷冰冻时间间隔,当前为1秒 #region 防恶意刷新 if (Session.SessionID == null) {   Response.End(); } else if (Session["sion

Cookies和Session的定义与区别

Cookies和Session二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie里的内容来判断使用者,送出特定的网页内容给你. Cookie 的使用很普遍,许多有提供个人化服务的网站,都是利用 Cookie来辨认使用者,以方便送出使用者量身定做的内容,像是 Web 接口的免费 ema

Cookies和Session的区别

原文:http://www.cnblogs.com/lijihong/p/4743818.html 今天主要学习了Cookies和Session,网络上关于这方面的知识可谓很多,让人眼花缭乱,在此作一个小结.本文不讲多,不讲什么高大上的,只是抛出一块砖,讲三个问题:①什么是Cookies和Session?②为什么要用Cookies和Session:③Session什么情况下被销毁.下一篇文章将以Java为例,简单实践一下. 1. 什么是Cookies,什么是Session? 关于这两个概念,很多

Farseer.net轻量级开源框架 中级篇:Cookies、Session、Request

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(Mapping) 下一篇:Farseer.net轻量级开源框架 中级篇: UrlRewriter 地址重写 Cookies.Session.Request是专门针对WEB项目的额外支持. 顺便说下,今天有园友在群里问到ORM对MVC的支持.或者对WinForm支持吗?对于ORM来说,本身是对表现层没有任何的联系.它仅仅是让你在开发的时候,能以面向对象的思想(语法)去做

浅析http协议、cookies和session机制、浏览器缓存

http协议中headers,cookies.session.缓存等相关知识,发现些新知识点. 这篇文章注重结合PHP去理解这些内容,也就是比较注重实践部分. 一.http headers           NO1:对于web应用,用户群在客户端 (各种浏览器)点击任何一个连接向服务器发送http请求,这过程肯定需要3次握手,建立连接,服务器响应返回数据. 每次请求都有头部和实体部分,先看下面笔者监听QQ空间的headers,QQ空间的原因是它头部内容比较全 ? 1 2 3 4 5 6 7 8

cookies与session的区别

HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session. 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id

有关cookies与session的详细信息

COOKIES与SESSION 详细信息参考:https://www.cnblogs.com/linguoguo/p/5106618.html 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. Cookie

Cookies和Session的区别和理解

Cookies和Session的区别和理解 cookie机制 Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器.IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范.网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies . 具体来说cookie机制采用的是在客户端保持状态的方案.它是在用