Cookie与Session
Cookie
Cookie是一种能够让网站服务器把少量数据(4kb左右)储存到客户端的硬盘或内存,并且读取出来的一种技术。
当你浏览某网站时,由Web服务器放置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、浏览过的网页或者停留的时间等网站想要你保存的信息。当你再次通过浏览器访问该网站时,浏览器会自动将属于该网站的Cookie发送到服务器去,服务器通过读取Cookie,得知你的相关信息,就可以做出相应的动作。
如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。
浏览器访问一个站点时,只将属于当前站点的Cookie发过到服务器。(根据域名)—(没必要把每家医院的病历本都带过去。)
Cookie不兼容浏览器!
最好是将要保存的内容在服务器端加密,为什么?
在硬盘中存放的位置与使用的操作系统和浏览器密切相关。
浏览器保存Cookie有两种方式:
1—浏览器的内存中;
2—浏览器所在的电脑的硬盘中。为将要写入到浏览器的Cookie对象设置失效时间:
cook.Expires = DateTime.Now.AddMinutes(5);//设置cook5分钟后失效
应用场景:比如京东或者易讯 您最近浏览过的商品
Cookie的Expires属性不可读.(只有在向浏览器写出的时候能设置)
两周内免登陆的例子演示Cookie
LoginByCookie.aspx
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<% @ Page Language="C#" AutoEventWireup="true" CodeFile="LoginByCookie.aspx.cs" Inherits ="LoginByCookie" %> <!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> <title >Cookie登录</ title> </head> <body> <form action="LoginByCookie.aspx" method="post"> <input type="text" name="txtName" /><br /> <input type="text" name="txtPwd" /><br /> <input type="submit" value="登录" /> <input type="checkbox" name="chkIsAll" value="1" />2周内免登录<br /> </form > </body> </html>
LoginByCookie.aspx.cs
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
protected void Page_Load(object sender, EventArgs e){ string strName = Request.Form["txtName" ]; if (!string .IsNullOrEmpty(strName)){ string strPwd = Request.Form["txtPwd" ]; if ((strName == "pizi" ||strName == "yimao") && strPwd == "1243658561"){ //新建一个cookie对象,并赋值 键值对 HttpCookie cookie = new HttpCookie( "un", strName); HttpCookie cookieDate = new HttpCookie( "ud", DateTime.Now.ToString()); if (!string .IsNullOrEmpty(Request.Form["chkIsAll"])){ //复选框 只要选中就有值 //设置cookie14天后失效(此cookie在浏览器端会以文本的方式保存在浏览器所在电脑的硬盘中) cookie.Expires = DateTime.Now.AddDays(14); cookieDate.Expires = DateTime.Now.AddDays(14); } //cookie.Path = "/Web/";//设置Path属性 是指当浏览器访问网站web目录时才发送cookie内容 ////设置cookie失效时间为前一天 就可以让cookie失效 //cookie.Expires = DateTime.Now.AddDays(-1); ////再把它发回浏览器,把原来保存在浏览器没失效的cookie覆盖掉,那么这个已经超时的新cookie就顺利的失效了 //Response.Cookies.Add(cookie); //输出cookie对象信息到浏览器 Response.Cookies.Add(cookie); Response.Cookies.Add(cookieDate); //两次添加的Cookie会合并在同一个文件中 //控制浏览器重定向到 登录后的首页 Response.Redirect( "CookieIndex.aspx"); } } }
CookieIndex.aspx.cs
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
protected void Page_Load(object sender, EventArgs e) { //从Request中获得浏览器提交来的cookie HttpCookie cookie = Request.Cookies["un" ]; //注意:Cookie的Expires属性不可读.(只有在向浏览器写出的时候能设置) //Response.Write(cookie.Expires.ToString()); if (cookie != null ) Response.Write( "欢迎您" + cookie.Value.ToString()); else Response.Write( "十分对不起!您没有访问权限,请返回登录页面重新登录后访问!<a href=Login.aspx'>返回登录</a>" ); }
服务端发送回的响应报文发生变化
第二次再次登陆Index的时候请求报文自动将cookie中保存的数据提交到服务器
保存在客户端的Cookie文件格式
Session
Session提供了一种把信息保存在服务器内存中的一种方式。它能存储各种数据类型包括自定义对象。
每个客户端的Session是独立存储。
Session 对象用于存储有关用户的信息。
在整个用户会话过程中都会保留此信息。
当用户在应用程序中从一个网页浏览到另一个网页时,存储在 Session 对象中的变量不会被丢弃。
Session只可由该会话的用户访问(因为SessionId的东东以cookie的方式保存访问者浏览器的缓存里了)
用户不能访问或修改他人的Session
开始为Session赋值:
Session[“uName”]=“CNYaoMing”;
取值:
string strName = Session[“uName”].ToString();
销毁(取消/退出):
Session.Abandon();//销毁服务器端的Session对象
Session.Clear();//清空服务端的Session对象里的键值对
Session登陆代码:
LoginBySession.aspx
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<% @ Page Language="C#" AutoEventWireup="true" CodeFile ="LoginBySession.aspx.cs" Inherits ="LoginBySession" %> <! 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 > Session登录</ title > </ head> < body> <form action="" method="post"> < input type ="text" name ="txtName" />< br /> < input type ="text" name ="txtPwd" />< br /> < input type ="submit" value ="登录" /> < br /> </form > </ body> </ html>
LoginBySession.aspx.cs
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
protected void Page_Load( object sender, EventArgs e){ string strName = Request.Form["txtName" ]; if (!string .IsNullOrEmpty(strName)){ string strPwd = Request.Form["txtPwd" ]; if ((strName == "pizi" || strName == "yimao") && strPwd == "1243658561" ){ //在服务器端创建一个 键值对为 un=strName的 session对象,并存入了服务器端的Sesssion池中,并返回该Session对象的 id号。 Session[ "un" ] = strName; //控制浏览器重定向到 登录后的首页 Response.Redirect( "LoginBySessionTarget.aspx" ); } } }
登陆成功后跳转页面LoginBySessionTarget.aspx.cs
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
protected void Page_Load( object sender, EventArgs e) { if (Session["un" ] != null) //Q1:Session["un"]是什么是否被赋值的? //A1:在HttpApplication请求管道 第9个事件的时候 根据浏览器发来的SessionId自动从服务端Session池中读取对应的SessionId对应的Session对象 并赋值给当前页面对象的Session属性 //所以在执行PR方法的时候Session早就有值了 这就是Session加载的原理 Response.Write( "欢迎您:" + Session[ "un"]); else Response.Write( "十分对不起!您没有访问权限,<a href='LoginBySession.aspx'>返回登录</a>" ); //Q2:如果浏览器禁用了Cookie的话 如何传递SessionId呢? //A2:可以通过将SessionId保存在url中完成SessionId在浏览器和服务器间的传递 //(需要设置配置文件里的sessionState节点的cookieless="autodetect") //<sessionState cookieless="AutoDetect"></sessionState> }
LoginBySessionTarget.aspx
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title ></title> </head> <body> <form id="form1" runat="server"> <div > <a href="LoginBySessionExit.ashx"> 退出销毁Session</a > LoginBySessionExit.ashx详细见《Session补充》 </div > </form > </body> </html>
响应报文中多了Set-Cookie:内容包含SessionId
再次发送请求跳转页面的时候Response.Redirect("SessionIndex.aspx");请求报文中就包含了缓存中的Cookie
Session原理图解: