<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AspNetSession1.aspx.cs" Inherits="AspNetSession1" %> <!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></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="设置Session" /> <asp:Button ID="Button2" runat="server" onclick="Button2_Click" Text="读取Session值" /> </div> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class AspNetSession1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //每次服务器处理Page_Load都会执行 if (!IsPostBack) //直接进入的时候才给session里的value设置初值 { Session["第一个值"] = 0; Session["第二个值"] = 0; } } protected void Button1_Click(object sender, EventArgs e) { //session放入的值是一个object的对像,所以我们可以放入任意的数据 Session["第一个值"] = DateTime.Now.ToString(); Session["第二个值"] = 300; } protected void Button2_Click(object sender, EventArgs e) { string s1 = Convert.ToString(Session["第一个值"]); string s2 = Convert.ToString(Session["第二个值"]); Response.Write("s1:"+s1+", s2:"+s2); } }
/* Session的原理
* private int i =0;
* 每次请求来的都会new一个新的实现了IHttpHandler接口的类"变量1"的实例进行处理,用完了就GC掉,所以不会保存上次的值
*
* Cookie不能存储过多信息,如果想保存大量的数据,可以保存一个Guid和Cookie中,然后在服务器中建立一个以Guid为Key,复杂数据为Value全局的Dictionary
* static字段对于不同用户也只有一份,因此用static现多用户共享数据,代码见备注
*
* ASP.net已经内置了session机制,把上面的例子用Asp.netsession重写,不要放太多的对像到session
* session会有超时销毁的机制,发帖(服各国器不可能知道浏览器是否在开着,什么时间关闭),发贴计时,在线时间统计
*
* 可以看到session的机制并不是httP协议规定的,是asp.net实现的,现在php,jsp等大部份服务端技术都实现了session,原理都差不多
*
* 案例,用session实现验证码