zoukankan      html  css  js  c++  java
  • 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原理图解

  • 相关阅读:
    Java相对路径读取文件
    【转载】 OpenCV ——双线性插值(Bilinear interpolation)
    【转载】 从ACM会议看中国大陆计算机科学与国外的差距
    【转载】 一个老博士的经验顺口溜! 研究生生活的精华总结!
    【转载】 研究生生活总结(2):从技术到研究再到技术的过程
    【转载】 研究生生活总结(1):当助教的那些人和事
    【转载】 如何看待 2019 年 CS PhD 现扎堆申请且大部分为 AI 方向?未来几年 AI 泡沫会破裂吗?
    【转载】 深度强化学习处理cartpole为什么reward很难超过200?
    【转载】 强化学习中 采用 【首次访问的蒙特卡洛预测法】 的算法描述
    【转载】 混合智能
  • 原文地址:https://www.cnblogs.com/guxingwork/p/2944615.html
Copyright © 2011-2022 走看看