Cookie与Session

Cookie

Cookie是一种能够让网站服务器把少量数据(4kb左右)储存到客户端硬盘或内存并且读取出来的一种技术。

当你浏览某网站时,由Web服务器放置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、浏览过的网页或者停留的时间等网站想要你保存的信息。当你再次通过浏览器访问该网站时,浏览器会自动将属于该网站的Cookie发送到服务器去,服务器通过读取Cookie,得知你的相关信息,就可以做出相应的动作。
如在页面显示欢迎你的标语,或者让你不用输入
ID、密码就直接登录等等。

浏览器访问一个站点时,只将属于当前站点的Cookie发过到服务器。(根据域名)—(没必要把每家医院的病历本都带过去。)

Cookie不兼容浏览器!

最好是将要保存的内容在服务器端加密,为什么?

在硬盘中存放的位置与使用的操作系统和浏览器密切相关。

浏览器保存Cookie有两种方式:
1—浏览器的内存中;
2—浏览器所在的电脑的硬盘中。为将要写入到浏览器的Cookie对象设置失效时间:
cook.Expires = DateTime.Now.AddMinutes(5);//设置cook5分钟后失效

  应用场景:比如京东或者易讯 您最近浏览过的商品

  CookieExpires属性不可读.(只有在向浏览器写出的时候能设置)

两周内免登陆的例子演示Cookie

LoginByCookie.aspx

View Code
<% @ Page Language="C#" AutoEventWireup="true" CodeFile="LoginByCookie.aspx.cs" Inherits ="LoginByCookie" %>
<!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>
    <title >Cookie登录</ title>
</head>
<body>
    <form action="LoginByCookie.aspx" method="post">
    <input type="text" name="txtName" /><br />
    <input type="text" name="txtPwd" /><br />
    <input type="submit" value="登录" /> <input type="checkbox" name="chkIsAll" value="1" />2周内免登录<br />
    </form >
</body>
</html>

LoginByCookie.aspx.cs

View Code
protected void Page_Load(object sender, EventArgs e){        string strName = Request.Form["txtName" ];
        if (!string .IsNullOrEmpty(strName)){
            string strPwd = Request.Form["txtPwd" ];
            if ((strName == "pizi" ||strName == "yimao") && strPwd == "1243658561"){
                //新建一个cookie对象,并赋值 键值对
                HttpCookie cookie = new HttpCookie( "un", strName);
                HttpCookie cookieDate new HttpCookie( "ud", DateTime.Now.ToString());
                if (!string .IsNullOrEmpty(Request.Form["chkIsAll"])){ //复选框 只要选中就有值
                    //设置cookie14天后失效(此cookie在浏览器端会以文本的方式保存在浏览器所在电脑的硬盘中)
                    cookie.Expires = DateTime.Now.AddDays(14);
                    cookieDate.Expires = DateTime.Now.AddDays(14);
                }
                //cookie.Path = "/Web/";//设置Path属性 是指当浏览器访问网站web目录时才发送cookie内容
                ////设置cookie失效时间为前一天  就可以让cookie失效
                //cookie.Expires = DateTime.Now.AddDays(-1);
                ////再把它发回浏览器,把原来保存在浏览器没失效的cookie覆盖掉,那么这个已经超时的新cookie就顺利的失效了
                //Response.Cookies.Add(cookie);
                //输出cookie对象信息到浏览器
                Response.Cookies.Add(cookie);
                Response.Cookies.Add(cookieDate); //两次添加的Cookie会合并在同一个文件中
                //控制浏览器重定向到 登录后的首页
                Response.Redirect( "CookieIndex.aspx");
            }
        }
    }

CookieIndex.aspx.cs

View Code
protected void Page_Load(object sender, EventArgs e) {
        //从Request中获得浏览器提交来的cookie
        HttpCookie cookie = Request.Cookies["un" ];
        //注意:Cookie的Expires属性不可读.(只有在向浏览器写出的时候能设置)
        //Response.Write(cookie.Expires.ToString());
        if (cookie != null )
            Response.Write( "欢迎您" + cookie.Value.ToString());
        else
            Response.Write( "十分对不起!您没有访问权限,请返回登录页面重新登录后访问!<a href=Login.aspx'>返回登录</a>" );
    }

服务端发送回的响应报文发生变化

第二次再次登陆Index的时候请求报文自动将cookie中保存的数据提交到服务器

保存在客户端的Cookie文件格式

Session

Session提供了一种把信息保存在服务器内存中的一种方式。它能存储各种数据类型包括自定义对象。

每个客户端的Session是独立存储。

Session 对象用于存储有关用户的信息。

在整个用户会话过程中都会保留此信息。

当用户在应用程序中从一个网页浏览到另一个网页时,存储在 Session 对象中的变量不会被丢弃。

Session只可由该会话的用户访问(因为SessionId的东东以cookie的方式保存访问者浏览器的缓存里了)

用户不能访问或修改他人的Session

开始为Session赋值:

  Session[“uName”]=“CNYaoMing”;

取值:

  string strName = Session[“uName”].ToString();

销毁(取消/退出)

  Session.Abandon();//销毁服务器端的Session对象

Session.Clear();//清空服务端的Session对象里的键值对

Session登陆代码:

LoginBySession.aspx

View Code
<% @ Page Language="C#" AutoEventWireup="true" CodeFile ="LoginBySession.aspx.cs" Inherits ="LoginBySession" %>
<! 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 > Session登录</ title >
</ head>
< body>
    <form action="" method="post">
        < input type ="text" name ="txtName" />< br />
        < input type ="text" name ="txtPwd" />< br />
        < input type ="submit" value ="登录" /> < br />
    </form >
</ body>
</ html>

LoginBySession.aspx.cs

View Code
protected void Page_Load( object sender, EventArgs e){
        string strName = Request.Form["txtName" ];
        if (!string .IsNullOrEmpty(strName)){
            string strPwd = Request.Form["txtPwd" ];
            if ((strName == "pizi" || strName == "yimao") && strPwd == "1243658561" ){
                //在服务器端创建一个 键值对为 un=strName的 session对象,并存入了服务器端的Sesssion池中,并返回该Session对象的 id号。
                Session[ "un" ] = strName;
                //控制浏览器重定向到 登录后的首页
                Response.Redirect( "LoginBySessionTarget.aspx" );
            }
        }
    }

登陆成功后跳转页面LoginBySessionTarget.aspx.cs

View Code
protected void Page_Load( object sender, EventArgs e) {
        if (Session["un" ] != null//Q1:Session["un"]是什么是否被赋值的?
            //A1:在HttpApplication请求管道 第9个事件的时候 根据浏览器发来的SessionId自动从服务端Session池中读取对应的SessionId对应的Session对象 并赋值给当前页面对象的Session属性
            //所以在执行PR方法的时候Session早就有值了 这就是Session加载的原理
            Response.Write( "欢迎您:" + Session[ "un"]);
        else
            Response.Write( "十分对不起!您没有访问权限,<a href='LoginBySession.aspx'>返回登录</a>" );
            //Q2:如果浏览器禁用了Cookie的话 如何传递SessionId呢?
            //A2:可以通过将SessionId保存在url中完成SessionId在浏览器和服务器间的传递
            //(需要设置配置文件里的sessionState节点的cookieless="autodetect")
            //<sessionState cookieless="AutoDetect"></sessionState>
    }

LoginBySessionTarget.aspx

View Code
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title ></title>
</head>
<body>
    <form id="form1" runat="server">
    <div >
    <href="LoginBySessionExit.ashx"> 退出销毁Session</>
LoginBySessionExit.ashx详细见《Session补充》
    </div >
    </form >
</body>
</html>

响应报文中多了Set-Cookie内容包含SessionId

再次发送请求跳转页面的时候Response.Redirect("SessionIndex.aspx");请求报文中就包含了缓存中的Cookie

Session原理图解

原文地址:https://www.cnblogs.com/guxingwork/p/2944615.html