Session的原理解析【Cookie与Session的关系】

Cookie与Session的关系

我就把当前访问的用户信息存储到服务端(session)的一块地方,在客户端(Cookie)里存储这个用户的一个标识(key),这个标识就就是session里的key 当这个用户在此来访问的时候,我就从Cookie里去取它的key,按照这个key去服务端(内存)中去找它的值(value,注意这个value是一个Dictionary<string,object>),这个value里就存储了用户的信息。

例如:Dictionary<"张三",Dictionary<"身高","170">>   注解:这个"张三"就是存在 Cookie里的key,当这个"张三"再次来访问的时候,我就从Cookie里取出"张三",然后根据这个"张三"去内存中查询 他的值value ,这样就会得到Dictionary<"身高","170">这个值了。也就是的到"张三"的信息了,这样就达到在客户端只是存放"张三"的名字,给张三的重要信息存到服务器端,更加安全了。

【 当浏览器关闭,或者网站重启或关闭的时候会话就结束了。即Session就关闭了】

浏览器里保存的cookie存储的是sessionId,而这个cookie是一个回话cookie,它存储在浏览器进程的内存当中,当浏览器关闭的时候,这个cookie就消失了。当这个cookie消失后,浏览器就无法携带这个cookie访问服务器,也就无法找到对应的session了。(其实当浏览器关闭,服务器里的对应session还是存在的,只是浏览器这边没有了这个sssion对应的seesionId了。所以就无法使用这个session了。这个session到时候会自动过期,然后才消失)


创建一个项目Session,在项目下面添加一个类 SessionMgr 添加一个WebForm1.aspx

SessionMgr 类 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Sesson
{
    public class SessonMgr
    {
       //其实 Session就是内存中的Dictionary,只不过它是一个特殊的Dictionary,它的value值也是一个Dictionary ,它是用来存session数据的:
       private static   Dictionary<string, Dictionary<string, object>> data = new Dictionary<string, Dictionary<string, object>>();

       //这个sesseionID就是用来做session的key的,方法的放回值就是session的value,这个value是一个dictionary<string,object>
        public static Dictionary<string, object> GetSession(string sesseionID)
        {
            if (data.ContainsKey(sesseionID)) //查询data中是否包含用户传递过来key为sessionID的session
            {
                return data[sesseionID]; //如果包含在data里面,那么就将它的值返回回去,它的值(data[sesseionID])其实就是一个Dictionary<string, object>;  【这个data[sessionID]就是Dictionary<string, Dictionary<string, object>>中的Dictionary<string, object>】
            }
            else
            {
                Dictionary<string, object> session = new Dictionary<string, object>();
                //data[sesseionID] = session;  另外一种写法

                data.Add(sesseionID, session);//将用户传过来的sessionID作为key,将自己创建的一个Dictionary<string,object>对象session作为值 添加到data中。
                return session;
            }
        }
      
        
    }
}



WebForm1.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Sesson.WebForm1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <p>
           <%-- 设置session--%>                    
            <asp:Button ID="Button1" runat="server" Text="设置session" OnClick="Button1_Click" />

            <%--获取session--%>
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>            
            <asp:Button ID="Button2" runat="server" Text="获取session" OnClick="Button2_Click" />


           <%-- 这个button用来弹出目目前浏览器里有哪些Cookie,他们的值是什么。--%>
            <input type="button" value="Test" οnclick="alert(document.cookie);" />

          
        </p>
    </div>
    </form>
</body>
</html>

WebForm1.cs

using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Sesson
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            
                //首先检查一下我的Cookies里面有没有一条叫做MySession的Cookie,如果没有,就将设置一个
                if (Request.Cookies["MySession"] == null)
                {
                    string sessionID = Guid.NewGuid().ToString();
                    //设置Cookie
                    Response.SetCookie(new HttpCookie("MySession", sessionID));//设置一个名字(key)为:MySession的Cookie,它的值设定为sessionID

                    /*
                    HttpCookie mycookie = new HttpCookie("abc"); //设置一个名字(key)叫"abc"的cookie ,它的值是下面三个dictionary<string,string>
                    mycookie.Values.Add("a", "111");
                    mycookie.Values.Add("b", "222");
                    Response.SetCookie(mycookie);
                    */
                }
            }
           

        //设置Session
        protected void Button1_Click(object sender, EventArgs e)
        {
            //首先,我先在Cookies里取一下名字为MySession的Cookie。这个Cookie其实就是Sesson的一个key。取得这个Sesson的key之后,我就调用SessonMgr.GetSession(sessionID)这个方法。
            string sessionID = Request.Cookies["MySession"].Value;

            //SessonMgr.GetSession(sessionID);这个方法就是创建一个key为MySession,值为Dictionary<string,object>的 Dictionary;然后给它的值返回回来。
            Dictionary<string,object> session= SessonMgr.GetSession(sessionID);
            session["Name"] = "张三"; //或者这样写: session.Add("Name", "张三"); 
            session["Age"] = "26";    //或者这样写: session.Add("Age", "26");
            session["Gender"] = "男"; //或者这样写: session.Add("Gender", "男");


            //*****************************************

            //做个比喻:那么这个Session实际的样子是:
            //Dictionary<"Mycationary" Dictionary<"Name","张三">;
            //Dictionary<"Mycationary" Dictionary<"Age","26">;
            //Dictionary<"Mycationary" Dictionary<"Gender","男">;

        }

        //获取Session
        protected void Button2_Click(object sender, EventArgs e)
        {
            string sessionID = Request.Cookies["MySession"].Value; //首先在Cookies里获得一个名字为MySession的Cookie值,这个值作为session的key
            Dictionary<string, object> session = SessonMgr.GetSession(sessionID); //根据获得的key去GetSession查询key为sessionID的Session
            TextBox2.Text = session["Name"].ToString() + session["Age"].ToString() + session["Gender"].ToString(); //将查询到值赋给TextBox2.Text
        }
    }
}



****************************************************************************************

【 测试】Test控制台应用程序:  Dictionary的取值 。与上面吗代码无关

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        
        static void Main(string[] args)
        {
            Dictionary<string, object> data = new Dictionary<string, object>();
            data.Add("UserName","无盐海");
            Console.Write(data["UserName"]); //输出"无盐海"
            Console.Read();
            
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值