• Asp.Net基础 6.Cookie + 7.Session原理


    6.Cookie
    7.Session原理
        7.1案例:用Session实现验证码。

    6.Cookie

    表单是和页面相关的,只有浏览器端提交了这些数据服务器端才能得到。而有时候希望在服务端任意的地方存取一些和访问者相关的信息,这时候就不方便将这些信息保存到表单中了,因为如果那样的话必须随时注意在所有页面表单中都保存这些信息。Cookie是和站点相关的,并且每次向服务器请求的时候除了发送表单参数外,还会将和站点相关的所有Cookie都提交给服务器,是强制性的。Cookie也是保存在浏览器端的,而且浏览器会在每次请求的时候都会把和这个站点的相关的Cookie提交到服务器,并且将服务端返回的Cookie更新回数据库,因此可以将信息保存在Cookie中,然后在服务器端读取、修改。服务器返回数据除了普通的html数据以外,还会返回修改的Cookie,浏览器把拿到的Cookie值更新本地浏览器的Cookie就可以

    案例:

    cookie1.aspx

    image

    cookie1.aspx.cs
    protected void Button1_Click(object sender, EventArgs e)
        {
            Response.SetCookie(new HttpCookie("color",TextBox1.Text));//在客户端也能通过$.cookie取。服务端设置cookie
        }

    下面是第二个页面

    cookie读2.aspx

    image

    cookie读2.aspx.cs
    protected void Button1_Click(object sender, EventArgs e)
        {
            Label1.Text = Request.Cookies["color"].Value;
        }

    image

    image

    7.Session原理

    Cookie不能存储过多信息。如果想保存大量的数据,可以保存一个Guid到Cookie中,然后在服务器中建立一个以Guid为Key,复杂数据为Value全局Dictionary。static字段对于不同用户也只有一份,因此用static实现多用户共享数据。代码见备注※。

    变量1.aspx

    image

    变量1.aspx.cs
    public partial class 变量1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //给cookie为MySessionId赋值,guid
            if (Request.Cookies["MySessionId"] == null)
            {
                string sessionId = Guid.NewGuid().ToString();
                Response.Cookies["MySessionId"].Value = sessionId;
            }
            
        }
        //设置session
        protected void Button2_Click(object sender, EventArgs e)
        {
            string sessionId = Request.Cookies["MySessionId"].Value;
            IDictionary<string, object> session = SessionMgr.GetSession(sessionId);
            session["服务端的数据"] = 3333;
        }
        //读取session
        protected void Button1_Click(object sender, EventArgs e)
        {
            string sessionId = Request.Cookies["MySessionId"].Value;
            IDictionary<string, object> session = SessionMgr.GetSession(sessionId);
            Label1.Text = session["服务端的数据"].ToString();
          }
    }
    SessionMgr.cs
    public class SessionMgr
    {
        public SessionMgr()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }
    
        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;
            }
        }
    }

    ASP.Net已经内置了Session机制,把上面的例子用ASP.NetSession重写。不要放太多的对象到Session,Session会有超时销毁的机制,发帖(服务器不可能知道浏览器是否在开着,什么时候关闭),发帖计时,在线时间统计,靠请求来判断是否活着。Cookie是存在客户端,Session是存在服务器端,目的是一样的:保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session、Cookie)。不能放太大的数据,放的数据是object

    7.1案例:用Session实现验证码。

    HttpHandler要能够操作Session,要实现IRequiresSessionState接口。为什么每次点击值都变化?很正常,因此每次页面点击页面都会刷新,就向ashx重新请求图片,ashx的ProcessRequest都会执行。正常网站登录成功就进入主页面,没机会让你看到变化,但是一旦输入错误也是变化。

    1.创建YZM.ashx

    <%@ WebHandler Language="C#" Class="YZM" %>
    
    using System;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    
    //HttpHandler使用Session要调用IRequiresSessionState接口
    public class YZM : IHttpHandler, IRequiresSessionState
    {
    
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "image/JPEG";
    
            using (Bitmap bitmap = new Bitmap(50, 30))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    //随机的验证码
                    Random ran = new Random();
                    int code = ran.Next(1,9999);
                    string strCode = code.ToString();
                    //写到Session里
                    HttpContext.Current.Session["Code"] = strCode;
                    g.DrawString(strCode,new Font("微软雅黑",12),Brushes.Wheat,new PointF(0,0));
                    bitmap.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
                }
            }
        }
    
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    
    }

    2.创建页面

    <body>
        <form id="form1" runat="server">
        <div>
        
    <img src="YZM.ashx"/>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </div>
        </form>
    </body>

    3.在验证码验证.aspx.cs代码里写

    protected void Button1_Click(object sender, EventArgs e)
        {
            string yzm = Convert.ToString((Session["Code"]));
            if (yzm == TextBox1.Text)
            {
                Response.Write("正确");
            }
            else
            {
                Response.Write("错误");
            }
        }

    imageimage

    点击图片产生新的验证码。 <img src="YZM.ashx" onclick="this.src='YZM.ashx?aaa='+new Date()" />每次点击都
    生成一个新的地址,让浏览器去请求。在AJAX中还会用。

  • 相关阅读:
    2级搭建类203-Oracle 19c SI ASM 静默搭建(OEL7.7)
    2级搭建类EM-Oracle EMCC 13c Release 3 在 OEL 7.7 上的搭建
    1级搭建类112-Oracle 19c SI FS(CentOS 8)
    0级搭建类013-CentOS 8.x 安装
    List添加map,后添加的map覆盖前面的问题
    mysql插入数据报错1366
    oracle ora-12514解决办法
    easyUI 创建详情页dialog
    Server Tomcat v7.0 Server at localhost failed to start.
    maven项目启动报错;class path resource [com/ssm/mapping/] cannot be resolved to URL because it does not exist
  • 原文地址:https://www.cnblogs.com/tangge/p/3023724.html
Copyright © 2020-2023  润新知