我是一个菜鸟,我只是在努力,2021正视自己,面对2021!

ASP.NET 高级编程基础第四篇—Session

 

前言: 经过前面三章的学习,相信我们队asp.net已经有了一个初步的认识,下来我们就说说在开发网站中最常使用的Session,在这篇博文中我将采用理论加代码的方法去学习他,相信如果写过验证码的人就一定知道session了。下面就让我们详述吧!

  1. 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的知识,我们可以学到很多东西的哦

posted @ 2012-08-10 17:21  Kencery  阅读(2359)  评论(6编辑  收藏  举报
友情链接:初心商城