1.Cookie
Cookie的比较确切的定义应该是这个样子:
“Cookie是Web服务器保存在用户硬盘上的一段文本。Cookie允许一个Web站点在用户的电脑上保存信息并且随后再取回它。信息的片断以‘名/值’对(name-valuepairs)的形式储存。”
举例来说,一个Web站点可能会为每一个访问者产生一个唯一的ID,然后以Cookie文件的形式保存在每个用户的机器上。
简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都记录下来。当下次你再光临同一个网站,Web服务器会先看看有没有它上次留下的Cookie资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你。
如果你实在不喜欢Web服务器乱丢饼干(Cookie)到你家,当然可以让浏览器拒绝网站存放Cookie到你的计算机。只要在IE的“工具”菜单下选择“Intertnet选项”的“安全”,按自定义级别,将Cookie部分设为关闭,按确定,关闭浏览器,再重新启动浏览器即可。当你关闭Cookie之后,很多网站的个人化服务功能很可能也不能再使用了.
2. Session
Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串.
除了SessionID,在每个Session中还包含很多其他信息。但是对于编写ASP或ASP.NET的程序与来说,最有用的还是可以通过访问ASP/ASP.NET的内置Session对象,为每个用户存储各自的信息。
ASP Session的功能的缺陷 :
<1>进程依赖性:ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。
<2>Session状态使用范围的局限性:刚一个用户从一个网站访问到另外一个网站时,这些Session信息并不会随之迁移过去。例如:新浪网站的WWW服务器可能不止一个,一个用户登录之后要去各个频道浏览,但是每个频道都在不同的服务器上,如果想在这些WWW服务器共享Session信息怎么办呢?
<3>Cookie的依赖性:实际上客户端的Session信息是存储与Cookie中的,如果客户端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
Session Cookie 区别 :
Session是存在服务器端的;而Cookie是存在客户端的!!
Session更不需要Cookie来支持和不会受浏览器端的设置影响,可记录每个访问者的信息,独立在服务器端,比Cookie安全!
Session是存在内存中的,浏览器关闭它也就“死”了;Cookie是以文件方式存在的,可以修改其“存活”时间。
Session Cookie结合保存用户状态:
session默认的保存时间是20分钟,一般来说只要是浏览器不关闭,我们也可以修改session的超时时间,但是我在一次操作中尝试直接修改session的Timeout,修改Global文件,Config文件均告无效。使用session和cookie联合的方式来解决问题。这样即使在关闭浏览器之后,我们依然可以找回之前的session。
此方法的思路是:就是把seeion存储进数据库中,然后把seesion的唯的ID写到客户机的cookie中去,这样子就不会因为seesion的短时间性而丢失了。
1.在用户登录时同时保存用户的session和cookie信息
HttpContext.Current.Session.Clear(); HttpContext.Current.Session["curUser"] = loginUser;//loginUser为保存用户信息的实体类 Request.Cookies.Clear(); Response.Cookies.Clear(); HttpCookie cookie = new HttpCookie("LoginInfo");//新建一个cookie DateTime dt = DateTime.Now; TimeSpan ts = new TimeSpan(1, 0, 0, 0, 0);//时间一天 cookie.Expires = dt.Add(ts); cookie.Values.Add("ID", loginUser.ID.ToString());//为新建的cookie添加键和值
2.在其他页面可以根据客户端的cookie而重新设置session信息
/// <summary> /// 判断Session超时 /// </summary> public static void IsLogin() { object um = HttpContext.Current.Session["curUser"]; object cook = HttpContext.Current.Request.Cookies["LoginInfo"]; bool ok = false; try { if (um != null) { ok = true; } else//Cookie重新写入Session { if (HttpContext.Current.Request.Cookies["LoginInfo"] != null) { HttpContext.Current.Session["curUser"] = null; int User_ID = int.Parse(HttpContext.Current.Request.Cookies["LoginInfo"]["ID"].ToString()); Model.User Muser = new User(User_ID);//数据库操作,由用户ID查询所有的用户信息 HttpContext.Current.Session["curUser"] = Muser;//重新设置session信息 ok = true; } else { ok = false; } } } catch (SystemException ex) { HyDebug.WriteToDoc("110:"+ex.Message);//HyDebug可以用直接写入文本的方式在网站发布之后查看我们的调试信息 ok = false; } if (ok == false) { System.Web.UI.Control con = new Control(); HttpContext.Current.Response.Write("<script>top.window.location.href='" + con.ResolveUrl("~/Login.aspx") + "';</script>"); HttpContext.Current.Response.End(); } }