zoukankan      html  css  js  c++  java
  • 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的知识,我们可以学到很多东西的哦

  • 相关阅读:
    Yarn架构基本概况(二)
    Yarn架构基本概况(二)
    Yarn架构基本概况(二)
    Yarn架构基本概况(一)
    Yarn架构基本概况(一)
    Yarn架构基本概况(一)
    从Hadoop 安全机制原理到当今主流安全机制
    WebService数据示例
    CXF浅析
    WebService的网络协议
  • 原文地址:https://www.cnblogs.com/hanyinglong/p/2632243.html
Copyright © 2011-2022 走看看