cookie 和 session 的区别
cookie 是保存在客户端上的一种机制 而session 是保存在服务端的一种机制
cookie的理解:
打个简单的比方,一个人生病了去A医院看病,回来的时候医生给了病人一个病历本(相当于cookie) 那么下次病人去复查的时候 就要带着这个病例本队A医院,如果拿着这个病历本去了B医院 B医院肯定是不承认的(不能够跨域取cookie,比如a.com的cookie只能由a.com, x.a.com, y.a.com等站点读取,b.com则不可以)
cookie的保存机制分两种: 第一种是会话cookie 第二种是 持久cookie
会话cookie: 如果没有设置过期时间 那么cookie的生命周期就是当前浏览器的会话时间 当浏览器关闭之后 那么cookie就会失效 这种生命期为浏览会话期的cookie称之为会话cookie
持久cookie: cookie对象 上加上了Expries属性之后 就会将这个cookie保存在客户端的硬盘上 在cookie为过期之前 那么再次访问这个网站的时候 会再次把cookie带过来
设置持久cookie
HttpCookie cookie=new HttpCookie(string,string);
cookie.Expires = DateTime.Now.AddDays(3);
context.response.cookies.Add(cookie);
取出设置的cookie的值
先判断context.request.cookies[string]!=null
string str=context.request.cookies[string].Value;
session的理解
1.0 session是存储在当前服务器的session池中 可以储存任何自定义的对象
2.0 当浏览器第一次访问的时候 会在session池中创建一个session 对象 同时产生一个sessionid 以set-cookie的形式发送给浏览器 浏览器将其保存在当前的进程中
3.0 当浏览器再次访问这个网站下的任何一个页面的时候 就会带上sessionid返回给服务器 在管道事件中的第9个和第10个事件之间进行赋值
判断当前页面是否有实现IRequiresSessionState 接口
从set-cookie 中取出sessionid 从服务器的session池中找到session对象
将session对象赋值给上下文的session属性
4.0 考虑到服务器的session池的容量有限 当储存的sessionde 数据过多 那么回导致session池的重启 然后session池里面的老数据就会丢失
考虑到进程内session的问题 可以使用进程外session 来解决
进程外session
状态服务器(优点:速度快: 缺点不稳定)
数据库 (优点:可以存储大量的数据 缺点:每次访问session都要访问db 比较消耗资源)
进程外session的设置
使用进程外session 是因为 一般储存shession的是使用的是进程内session储存的数据有限
使用进程外session 的要求
1.0 首相将session 中进行保存的对象所属的类药进行序列化[serializable]
2.0 在计算机管理-服务- asp.net State Services 进行开启服务
3.0 在当前站点的web.config 中添加配置
<system.web>
<sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState>
</system.web>
配置完成之后 那么就可以使用进程外session了
进程外session 的优点 速度快 缺点: 只能拿个储存少量的session数据
-------------------------------------------------------------------------------------------------------------------------------------------
进程外session 之数据库
优点:比较稳定 确定 每一次访问session的时候都要访问数据库 比较消耗性能
使用数据库 的操作步骤
1.0 找到aspnet_regsql.dll程序集所在的位置(C:\Windows\Microsoft.NET\Framework\v4.0.30319)
2.0 使用cmd 命令 切换到当前的文件夹之下(cd C:\Windows\Microsoft.NET\Framework\v4.0.30319)
3.0 输入创建数据库的cmd命令 aspnet_regsql -S . -U sa -P 123 -ssadd -sstype c -d aspnetdb
如果 -S后面街上127.0.0.1 无法连接到SQL server 这里可以把127.0.0.1 换成点 在尝试 -U -P -d 根据情况而定
配置完成之后在数据库中会有两个表 还有有一个触发器和一个存储过程
4.0 在web.config 中使用 <sessionState</sessionState> 节点下配置
<sessionState sqlConnectionString="server=.;database=aspnetdb;uid=sa;pwd=123;" allowCustomSqlDatabase="true" mode="SQLServer">
</sessionState>
节点中的 server 选择自己要链接的数据库地址 database:需要链接的数据库的名称 uid:database所在的服务器的登录名称 pwd:登陆密码 mode 数据库类型