一、Cookie(分两种操作方式)
(一)第一种操作方式
#region 第一种操作方式
//(一)未带子健的 Cookie
//1.编写(创建 和 修改 一样)
HttpCookie cookie = new HttpCookie("userName");
cookie.Value = "李春林";
cookie.Expires = DateTime.Now.AddHours(1);
Response.Cookies.Add(cookie);
//2.读取
if (Request.Cookies["userName"] != null)
{
string userName = Request.Cookies["userName"].Value;
userName = Server.HtmlEncode(userName);//确保恶意用户没有向 Cookie 中添加可执行脚本
}
//3.删除
HttpCookie cookie = new HttpCookie("userName");
cookie.Expires = DateTime.Now.AddHours(-1);
Response.Cookies.Add(cookie);
//(二)带子健的 Cookie
//1.编写(创建 和 修改 一样)
HttpCookie cookie = new HttpCookie("userInfo");
cookie.Values["userName"] = "李春林";
cookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(cookie);
//2.读取
if (Request.Cookies["userInfo"] != null)
{
string userName = Request.Cookies["userInfo"].Values["userName"];
userName = Server.HtmlEncode(userName);//确保恶意用户没有向 Cookie 中添加可执行脚本
}
//3.删除
//3.1 删除子键的方式
HttpCookie cookie=Request.Cookies["userInfo"];
if (cookie != null)
{
cookie.Values.Remove("userName");
cookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(cookie);
}
//3.2 删除父键的方式
HttpCookie cookie = new HttpCookie("userInfo");
cookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(cookie);
#endregion
#region 第二种操作方式
//(一)未带子健的 Cookie
//1.编写(创建 和 修改 一样)
Response.Cookies["userName"].Value = "李春林";
Response.Cookies["userName"].Expires = DateTime.Now.AddHours(1);
//2.读取(跟第一种方式一样)
if (Request.Cookies["userName"] != null)
{
string userName = Request.Cookies["userName"].Value;
userName = Server.HtmlEncode(userName);//确保恶意用户没有向 Cookie 中添加可执行脚本
}
//3.删除
Response.Cookies["userName"].Expires = DateTime.Now.AddHours(-1);
//(二)带子健的 Cookie
//1.编写(创建 和 修改 一样)
Response.Cookies["userInfo"]["userName"] = "李春林";
Response.Cookies["userInfo"].Expires = DateTime.Now.AddHours(1);
//2.读取
if (Request.Cookies["userInfo"] != null)
{
string userName = Request.Cookies["userInfo"]["userName"];
userName = Server.HtmlEncode(userName);//确保恶意用户没有向 Cookie 中添加可执行脚本
}
//3.删除
//3.1 删除子键的方式(跟第一种方式一样)
HttpCookie cookie = Request.Cookies["userInfo"];
if (cookie != null)
{
cookie.Values.Remove("userName");
cookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(cookie);
}
//3.2 删除父键的方式
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(-1);
#endregion
(三)注意
1.Cookie 只能存储字符串类型(String)的数据,并且是存在客户端的,不是存在服务端的。
2.不能直接修改 Cookie,删除 Cookie(即从用户的硬盘中物理移除 Cookie)是修改 Cookie 的一种形式。
3.每个 Cookie 通常限制为 4096 字节(即4KB大小,超过将不会添加该Cookie,但不会抛异常)。
4.每个站点一般最多可存储 20 个 Cookie,如果同一站点Cookie过多可以创建带子键的 Cookie。
5.在获取 Cookie 的值之前,应确保该 Cookie 存在;如果该 Cookie 不存在,将会收到 NullReferenceException 异常。
6.在设置 Cookie 的值之前,如果值包括分号(“;”),应该使用 Server.UrlEncode() 函数对其编码,否则前台使用 Cookie 时得到的值不完整。
7.如果值页面中显示 Cookie 的内容前,先调用 HtmlEncode 方法对 Cookie 的内容进行编码。这样可以确保恶意用户没有向 Cookie 中添加可执行脚本。
8.服务器端只能设置 Cookie 的过期时间,而不能获取 Cookie 的过期时间,因为浏览器每次发送请求也不会把过期时间发送到服务器。
二、Session
Session的增删改查非常简单,如下:
保存会话:
Session["userName"]="李春林";//保存,这里可以存储任意类型的数据,包括对象、集合等
Session.Timeout=40;//过期时间40分钟
读取会话:
if (Session["userName"] != null)
{
string userName = Session["userName"].ToString();
}
//这里为引用类型,可以直接强制转换为存放时的类型
string userName = (string)Session["userName"];
Session.Abandon();
2.Session 属性的访问
在Web Forms的后台页面(Page)和 MVC的控制器(Controller)中 可以直接访问到Session属性
一般处理程序 中 可以使用 context.Session 访问
类中需要使用 HttpContext.Current.Session 访问
会话标识符:
默认情况下,SessionID 存储在浏览器未到期会话的 cookie 中。
通过在 Web.config 文件的 sessionState 节中将 cookieless 属性设置为 true,可以指定不将会话标识符存储在 cookie 中,将会存放在URL中传递,个人不建议这样使用(不安全、不方便 并且 会造成共享会话)。
会话状态事件:
ASP.NET 提供了两种帮助您管理用户会话的事件:Session_OnStart 事件和 Session_OnEnd 事件;前者在新会话开始时引发,后者在会话被放弃或过期时引发。
可以使用会话事件(Session_OnStart() 和 Session_OnEnd())统计在线人数。
注意:只有会话状态属性 Mode 设置为 InProc(默认值)时,才支持 Session_OnEnd 事件
会话状态模式:
ASP.NET 会话状态模式包括5种:InProc模式(进程内模式)、StateServer模式(状态服务器模式)、SQLServer模式、Custom模式(自定义模式) 和 Off 模式。
1.InProc 模式:会话状态存储在 Web 服务器上的内存中。
这是默认设置。唯一支持 Session_OnEnd 事件的模式。
2.StateServer 模式:会话状态存储在一个名为 ASP.NET 状态服务的单独进程中。
需要启动服务名称为aspnet_state 显示名称为ASP.NET State Service的服务。并配置Web.config文件如下:
本地服务器名称为: localhost 或者 127.0.0.1
在注册表里可配置是否运行远程连接 和 端口号,如下:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\Port
3.SQLServer 模式:会话状态存储到一个 SQL Server 数据库中。
需要在 SQL Server 上安装 ASP.NET 会话状态数据库,可以使用 Aspnet_regsql.exe 工具安装会话状态数据库 和 运行InstallSqlState.sql脚本。并配置Web.config文件如下:
Data Source=LCL\SQLSERVER2012 表示数据库的服务器名称为“LCL\SQLSERVER2012”。
Integrated Security=SSPI 表示使用Windows集成身份验证。
使用此模式可以确保在重新启动 Web 应用程序时保留会话状态,并使会话状态可用于网络场中的多个 Web 服务器。
安装会话状态数据库后会创建aspnetdb和ASPState数据库,并且状态存储在系统数据库的tempdb数据库中的ASPStateTempSessions表里。
注意:需要运行SQLAgent服务(显示名称“SQL Server 代理”),并在数据库软件里的[SQL Server 代理]-[作业]里启动 ASPState_Job_DeleteExpiredSessions 作业。这样会自动清理过期的Session信息,如果不清理则SessionId一直存放在数据库,并且在服务器Session信息一直不会消失。
4.Custom 模式:允许您指定自定义存储提供程序。
5.Off 模式:禁用会话状态。