Cookie与Session
Cookie是存在于浏览器客户端端的一个文本字符串
存在内存中 不指定过期时间
或磁盘中 指定过期时间
最大4KB 不能改 由浏览器决定
与具体网站和浏览器(类型)相关
Cookie放在请求报文中发送到服务端(不需要程序员干预)
应用场景:
(1)记录上次访问商品信息 因为匿名用户 不适用于存在数据库中 存于张三用的这台电脑上 换电脑不可 购物车 只存商品编号 不要都存
(2)记住登录名
最多创建20个Cookie 有多值Cookie解决
创建Cookie的2种方式
(1)response.cookies["ck1"].value="laoWang";
response.cookies["ck1"].expires=datetime.now.addDay(3);//可以不指定过期时间就存到了内存中
(2)HttpCookie cookie1=new HttpCookie("ck1","laoWang");
cookie1.value="laoWang";//或上行去掉值,此赋值给Cookie
cookie1.expires=datetime.now.addDay(3);
response.cookies.add(cookie1);
删除cookie,把过期时间改为现在以前
response.cookies["ck1"].expires=datetime.now.addDay(-1);
cookie跨域问题 一个大网站有主域和二级域名,比如百度 有百度音乐 百度文库... 主域Cookie子域自动接收没问题 但子域创建cookie没法发给主域
只能在创建子域cookie时用response.cookies["ck1"].domain=主域名比如:www.baidu.com
主域名 子域名
cookie的path问题: 来源 当一个网站比较大,有多个文件夹, 只希望某文件夹可以访问创建的cookie 就用response.cookies["ck1"].path="/文件夹/.../"来做 这样只有当访问该文件夹下的aspx时才可以读到cookie
cookie是不安全的, 因其存在浏览器的客户端 这台电脑是公共的就更不安全 比如记住用户名, 银行网站从不记住登录用户名
可存一些对安全要求不高的数据
--------------------------------
session也是一种状态保持机制 是服务器端的状态保持机制
存session简单
string name=request.form["txtName"];
session["UserName"]=name;//此一行搞定
session内部实现过程 session id(不重复) 内容为UserName=name 不同用户登录 session id不同 登录名可同可不同
session id 会以cookie形式从服务端返回给浏览器 只要浏览器不关 此session id就不丢 当访问其它页面时 此session id就一直存在 访问该网站
其它页面时 此sesseion id就发送给服务端 服务端再根据浏览器访问某页面发送赤来的的session id 到session id那张表里 取出sesseion数据再赋
给session对象(session名字)比如上面的UserName 再返回给浏览器 判断此用户名登录过则允许访问该页面, 否则跳转到登录页面
后来的登录用户也不覆盖前面登录的用户 是以不同的Session id存到表里的不同单元里
Session是存在服务器端 不要把大数据存到Session中
过期时间是20分钟 是滑动过期时间 即比如19分钟访问了 则剩余1+20(再延20分钟) 共计21分钟 如果过了20分钟没有请求 则Session中的该Session id的数据会被清除掉
如果请求时 给Session赋完值(创建)了即Session["UserName"]="aaa"; 立即把客户端浏览器关了 则服务端的Session的数据没有丢(20分钟呢)
但又立即打开浏览器来访问页面 此时cookie中的Seesion id没(丢)了, 也不会发送到服务端 则从服务端中无法匹配到 尽管还存在的Session数据
当然就无法访问session了, 如果是登录后各个页面可以访问 则此时由于关了浏览器则 也会跳转到登录页面 服务端的这个Session id由于没人
访问了, 20分钟后也会被系统收回了
应用场景:
匿名 购物信息 不可用
主要用在登录时 登录页+多页面访问时 防止其它用户直接访问其它页面 限制一下, 安全
------------------------------------------------------
验证码: 一般会把生成的验证码存在ashx中的Session中, 如果在ashx中存Session 则注意必须把ashx.cs的类继承一下IRequiresSessionState接口
否则在ashx中的context.Session["validateCode"]=code不会有效 这个继承是一个标记 但aspx不用实现这个接口,因为aspx继承了page,page中有这个接口了 在aspx中直接使用Sesion就可以了
忽略大小写比较 sysCode.Equals(txtCode),Stringcomparition.InvariantCultureIgnoreCase

浙公网安备 33010602011771号