ASP.NET 高级编程基础第四篇—Session
前言: 经过前面三章的学习,相信我们队asp.net已经有了一个初步的认识,下来我们就说说在开发网站中最常使用的Session,在这篇博文中我将采用理论加代码的方法去学习他,相信如果写过验证码的人就一定知道session了。下面就让我们详述吧!
- asp.net中使用session
(1) 先使用案例来简单的说明一下session的读取信息
1) 新建一个类文件,SessionMy.cs,写入下面的代码:
1 public class SessionMy 2 3 { 4 5 private static IDictionary<string, IDictionary<string, object>> data = new Dictionary<string, IDictionary<string, object>>(); 6 7 public IDictionary<string, object> GetSession(string SessionID) 8 9 { 10 11 if (data.ContainsKey(SessionID)) 12 13 { 14 15 return data[SessionID]; 16 17 } 18 19 else 20 21 { 22 23 IDictionary<string, object> session = new Dictionary<string, object>(); 24 25 data[SessionID] = session; 26 27 return session; 28 29 } 30 31 } }
2) 新建一个asp.net页面,拖放两个Button控件,第一个控件设置为“读取Session”,第二个控件设置为“设置Session”,双击“设置Session“在其事件下面写入如下代码:
1 protected void Page_Load(object sender, EventArgs e) 2 3 { 4 5 if (Request.Cookies["MySessionID"] == null) 6 7 { 8 9 string sessionID = Guid.NewGuid().ToString(); 10 11 Response.SetCookie(new HttpCookie("MySessionID", sessionID)); 12 13 } 14 15 } 16 17 protected void Button2_Click(object sender, EventArgs e) 18 19 { 20 21 string sessionID = Request.Cookies["MYSessionID"].Value; 22 23 IDictionary<string, object> session = SessionMy.GetSession(sessionID); 24 25 session["name"] = "韩迎龙:"; 26 27 Session["服务器的数据"] = DateTime.Now.ToString(); 28 29 }
3) 然后双击”读取Session”控件在其下面输入如下代码:
1 protected void Button1_Click(object sender, EventArgs e) 2 3 { 4 5 string sessionID = Request.Cookies["MySessionID"].Value; 6 7 IDictionary<string, object> session = SessionMy.GetSession(sessionID); 8 9 Button1.Text = Convert.ToString(session["name"]) + Convert.ToString(Session["服务器的数据"]); 10 11 }
(2) Cookie不能存储过多信息,如果想要保存大量的数据,可以保存一个Guid到Cookie中,然后在服务器上面建立一个以Guid为key,复杂数据为value全局Dictionary,static字段对于不同用户也另有一份,一次static实现多用户共享数据。
(3) asp.net已经内置了一个Session机制,把上面的例子用asp.net重写,不要放太多的对象到session,session会有超时销毁的机制,发帖(服务器不可能知道浏览器是否开着,什么时候关闭)发帖记时,在线时间统计,考请求来判断。
(4) 可以看到Session机制并不是Http协议规定的,是asp.net实现的,现在,php,jsp等大部分服务端技术都实现了session,原理都差不多。
(5) asp.net提供的session,新建一个web项目,在页面中拖放两个控件为设置和读取,在单击设置按钮的事件下面写入如下代码:
1 protected void Button1_Click(object sender, EventArgs e) 2 3 { 4 5 Session["第一个值"] = DateTime.Now; 6 7 Session["第二个值"] = "&110"; 8 9 }
然后单击读取在其事件下写入如下代码:
1 protected void Button2_Click(object sender, EventArgs e) 2 3 { 4 5 Button2.Text = Convert.ToString(Session["第一个值"]) + Session["第二个值"]; 6 7 }
(6) Session版的自增,新建一个Web页面,在页面中拖放一个文本框和一个按钮,文本框默认为0,然后双击Button控件在其时间下面写如下代码:
1 protected void Page_Load(object sender, EventArgs e) 2 3 { 4 5 //m每次服务器处理page_load都会执行,直接进入的时候才给Session里的value设置初始值 6 7 if (!IsPostBack) 8 9 { 10 11 Session["value"] = 0; 12 13 } 14 15 } 16 17 protected void Button1_Click(object sender, EventArgs e) 18 19 { 20 21 int v = Convert.ToInt32(Session["value"]); 22 23 v++; 24 25 Session["value"] = v; 26 27 TextBox1.Text = v.ToString(); 28 29 }
(7) Cookie是存在客户端中的,Session是存在服务器端的,目的是一样的,保存和当前客户端相关的数据,不能放太大的数据,放的数据是object。
(8) 案例:用Session实现验证码
1) 新建两个页面,一个页面是一般处理程序,一个页面是验证码测试页来实现验证码的操作,在一般处理程序中写入如下代码:
1 public class yanzhengmasession : IHttpHandler,System.Web.SessionState.IRequiresSessionState { 2 3 public void ProcessRequest(HttpContext context) 4 5 { 6 7 context.Response.ContentType = "image/JPEG"; 8 9 using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(100, 50)) 10 11 { 12 13 using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap)) 14 15 { 16 17 /* 18 19 g.DrawString("神州大地", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Green, new System.Drawing.PointF(0, 0)); 20 21 g.DrawEllipse(System.Drawing.Pens.Red, new System.Drawing.Rectangle(10, 10, 10, 10)); 22 23 System.Drawing.Pen pen = (System.Drawing.Pen)System.Drawing.Pens.Red.Clone(); 24 25 pen.Width = 3; 26 27 g.DrawEllipse(pen, new System.Drawing.Rectangle(20, 20, 10, 10)); 28 29 bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); 30 31 */ 32 33 Random rand = new Random(); 34 35 int code = rand.Next(1000, 9999); //产生随机验证码 36 37 string strCode = code.ToString(); 38 39 //如果需要在一般处理程序中操作session,必须实现IRequireSessionState接口,否则不显示验证码 40 41 HttpContext.Current.Session["code"] = strCode; //将验证码放入Session 42 43 g.DrawString(strCode, new System.Drawing.Font("宋体", 30), System.Drawing.Brushes.Green, new System.Drawing.PointF(0, 0)); 44 45 bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); 46 47 } 48 49 } 50 51 } 52 53 }
2) 在验证码测试页中写入如下代码,拖放一个TextBox控件和一个Button控件,然后给一个Div,代码如下:
1 <div> 2 3 <img src="yanzhengmasession.ashx" onclick="this.src='yanzhengmasession.ashx?code='+new Date()+''" /> 4 5 <div>
在Buttot控件的事件下面写入如下代码:
1 protected void Button1_Click(object sender, EventArgs e) 2 3 { 4 5 string code = Convert.ToString(Session["code"]); 6 7 if (code == TextBox1.Text) 8 9 { 10 11 Response.Write("正确"); 12 13 } 14 15 else 16 17 { 18 19 Response.Write("错误"); 20 21 } 22 23 }
注:Session我们就说完了,下面博文我们开始说Http协议的一些知识点。我们的群号是:159227188,欢迎大家在这里交流asp.net的知识,我们可以学到很多东西的哦
初心商城:初心商城
作者:韩迎龙(Kencery) MVC/.NET群:159227188如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏一杯咖啡,本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利