1.下面讲一下全局变量和局部变量的区别
新建一个web页面,拖一个label控件,id为Label1;一个Button控件,id为Button1:
1 private int i = 0;//每次请求来了都会new一个新的实现了IhttpHandlder接口的类“变量1”的实例进行处理,用完了就GC掉,所以不会保持上次的值。 2 3 private static int j = 0;//所有的访问者都王文同一个实例 4 protected void Page_Load(object sender, EventArgs e) 5 { 6 7 } 8 protected void Button1_Click(object sender, EventArgs e) 9 { 10 //i++; 11 //Label1.Text = i.ToString(); 12 13 j++; 14 Label1.Text = j.ToString(); 15 }
2.Cookie不能存储过多信息, 如果想保存大量的数据,可以保存一个Guid到Cookie中,然后在服务器中建立一个以Guid为key,复杂数据位Value的全局Dictionary。Static字段对于不同用户也只有一份,因此用static实现多用户共享数据。
下面讲一个session的原理:
在App_Code中新建一个类,MySession.cs,代码如下:
public class MySession { private static IDictionary<string, IDictionary<string, object>> data = new Dictionary<string, IDictionary<string, object>>(); public static IDictionary<string,object> GetSession(string sessionId) { if(data.ContainsKey(sessionId)) { return data[sessionId]; } else { IDictionary<string, object> session = new Dictionary<string, object>(); data[sessionId]=session; return session; } }
新建一个Web页面,拖两个Button控件,一个Label控件,设置Session值和读取Session的代码如下:
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 4 if (Request.Cookies["mySessionId"] == null) 5 { 6 string sessionId = Guid.NewGuid().ToString(); 7 Response.SetCookie(new HttpCookie("mySessionId", sessionId)); 8 } 9 10 } 11 protected void Button1_Click(object sender, EventArgs e)//设置Session里面的值 12 { 13 string sessionId=Request.Cookies["mysessionId"].Value; 14 IDictionary<string,object> session= MySession.GetSession(sessionId); 15 session["服务器端数据1"] = "叶子"; 16 session["服务器端数据2"] = "佳佳"; 17 } 18 protected void Button2_Click(object sender, EventArgs e)//读取Session里面的值 19 { 20 string sessionId = Request.Cookies["mySessionId"].Value; 21 IDictionary<string, object> session = MySession.GetSession(sessionId); 22 Label1.Text = Convert.ToString(session["服务器端数据1"]) + Convert.ToString(session["服务器端数据2"]); ; 23 }
3.实际上Asp.net已经内置了Session机制,把上面的例子用asp.netSession重写:
新建一个web页面,拖两个Button控件和一个Label控件,添加两个按钮的双击事件,写如下代码:
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 4 } 5 protected void Button1_Click(object sender, EventArgs e) 6 { 7 Session["name"] = "叶子"; 8 Session["data"] = DateTime.Now.ToString(); 9 } 10 protected void Button2_Click(object sender, EventArgs e) 11 { 12 Label1.Text = Convert.ToString(Session["name"]) + Convert.ToString(Session["data"]); 13 }
可以看到Session机制并不是Http协议规定的,是asp.net实现的,现在,php,jsp等大部分服务端技术都实现了session,原理都差不多。
4. 不要放太多的对象到Session,Session会有超时销毁的机制。发帖(服务器不可能知道浏览器是否在开着,什么时候关闭)。Cookie是存在客户端,Session是存在服务器端,目的是一样的:保存和当前客户端相关的数据。不能放太大的数据,放的数据是object.不希望用户改的数据要放到session里边。
5.session版自增
新建一个web页面,拖放一个Button控件,添加该控件的双击事件,代码如下:
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 //每次服务器处理page_load都会执行,直接进入的时候才给Session里的value设置初始值 4 5 if (!IsPostBack) 6 {//如果网站是第一次加载 7 Session["value"] = "0"; 8 } 9 } 10 protected void Button1_Click(object sender, EventArgs e) 11 { 12 int v = Convert.ToInt32(Session["value"]); 13 v++; 14 Session["value"] = v; 15 TextBox1.Text = Convert.ToString(Session["value"]); 16 }
6.案例:用session实现验证码机制
新建一个一般处理程序页面,添加如下代码:
1 context.Response.ContentType = "image/JPEG"; 2 using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(100, 50)) 3 { 4 using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap)) 5 { 6 //g.DrawString("叶子佳佳", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Green, new System.Drawing.PointF(0, 0)); 7 //g.DrawEllipse(System.Drawing.Pens.Red,new System.Drawing.Rectangle(10,10,10,10)); 8 //System.Drawing.Pen pen = (System.Drawing.Pen)System.Drawing.Pens.Red.Clone(); 9 //pen.Width = 3; 10 //g.DrawEllipse(pen,new System.Drawing.Rectangle(20,20,10,20)); 11 Random rand = new Random(); 12 int code = rand.Next(1000,9999);//产生一个随机数 13 string strCode = code.ToString(); 14 HttpContext.Current.Session["Code"] = strCode;//将这个随机数记录到session中 15 g.DrawString(strCode,new System.Drawing.Font ("宋体",30),System.Drawing.Brushes.Green,new System.Drawing.PointF(0,0));//画出这个随机数 16 bitmap.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);//将画有随机数的图片在屏幕上显示出来。 17 } 18 }
新建一个web页面,拖放一个Button控件和一个TextBox控件,在web页面的源页面添加以下代码:
1 <div> 2 <img src="YZMr.ashx" onclick="this.src='YZMr.ashx?aaa='+new Date()+''" /> 3 4 ....... 5 </div>
双击Button,添加以下代码:
1 protected void Button1_Click(object sender, EventArgs e) 2 { 3 string CorretNum = Convert.ToString(Session["Code"]); 4 if (TextBox1.Text == CorretNum) 5 { 6 Response.Write("输入正确"); 7 } 8 else 9 { 10 Response.Write("输入错误"); 11 } 12 13 }
以上就是Session的知识。