zoukankan      html  css  js  c++  java
  • asp.net 10 Cookie & Session

    Cookie

    1.什么是Cookie

    一小段文本,明文的数据,关于网站相关的文本字符串数据.一个客户端状态保持机制~

    存储在客户端的浏览器内存里面或者磁盘(如果不指定过期时间,那么存储在客户端浏览器内存中,如果指定了过期时间,那么存储在客户端的磁盘上.)

    cookie跟网站有关的,各个网站只能访问跟自己网站相关的cookie(自动执行!?:cookie会随着请求网站一块发送到后台,如果请求百度的时候,那么就把百度的cookie放到请求报文里面去,然后发送到后台!)

    2.cookie的创建和属性

     cookie的创建:

    //Cookie:是一个客户端状态保持机制,(网站的数据是存在客户端),与隐藏域与ViewState对象都属于这种客户端状态保持,Cookie中存储的是关于网站相关的文本字符串数据。Cookie的存储方式有两种,如果不指定过期时间,那么存储在客户端浏览器内存中,如果指定了过期时间,那么存储在客户端的磁盘上。Cookie是与具体的网站有关的,如果我们将Cookie设置了过期时间,那么当用户在指定时间内访问我们的网站,那么属于我们网站的Cookie数据会放在请求报文中发送过来,其它网站的Cookie不会发送。
    
    
                //创建Cookie.
                Response.Cookies["cp1"].Value = "itcast";//执行这行代码时,最后会在返回的响应报文的响应头中加上一个Set-Cookie:cp1=itcast;path=/ 返回给浏览器.由于这里没有指定过期时间,所以cookie数据"itcast"默认是存储在浏览器内存中的.
                
    
                //创建Cookie并且指定过期时间.
                Response.Cookies["cp2"].Value = "laowang";
                Response.Cookies["cp2"].Expires = DateTime.Now.AddDays(3);//指定过期时间
    
                //删除Cookie
               // Response.Cookies["cp2"].Expires = DateTime.Now.AddDays(-1);
    
    
                //Cookie跨域(域名)
                Response.Cookies["cp3"].Value = "laowang";
                Response.Cookies["cp3"].Domain = "xxx.com";//设置主域的。
                /*
                 *Cookie的域:浏览器往后台发送数据时候,要把cookie放到请求报文里面去,发送到后台。
                 *那么有个问题:请求是子域的网页,那么主域的cookie会不会发送到后台呢?
                 *答案:是的。一块发送。如果请求时主域页面,子域的cookie是不会发送到后台的。
                 *如果子域想让请求主域页面的时候也一块发送到后台,设置当前Cookie的域为主域可以了。*/
               
                Response.Cookies["cp3"].Path = "/2015-5-31";
                /*
                 * cookie可以设置一个Path来限制某个路径下面的页面才会把cookie发送到后台。
                 *比如:请求图片,请求一个css、js,为了提高性能,可以通过 path设置页面的所在路径,来控制cookie的发送。
                 */
    
                Response.Cookies["cp3"].Expires = DateTime.Now.AddDays(3);
    
    
                //另外一种创建Cookie的方式。
                HttpCookie cookie1 = new HttpCookie("cp4","sssss");
                cookie1.Expires = DateTime.Now.AddDays(3);
                Response.Cookies.Add(cookie1);

    cookie的读取:

       //获取Cookie的值
                if (Request.Cookies["cp2"] != null)
                {
                    Response.Write(Request.Cookies["cp2"].Value);
                }

    3.cookie的应用场景

    记住登录用户名

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" 
        Inherits="CZBK.ItcastProject.WebApp._2015_5_31.Login" %>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        用户名:<input type="text" name="txtName"  value="<%=LoginUserName%>"/><br />
            密码;<input type="password" name="txtPwd" /><br />
            <input type="submit" value="登录" />
        </div>
        </form>
    </body>
    </html>
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace CZBK.ItcastProject.WebApp._2015_5_31
    {
        public partial class Login : System.Web.UI.Page
        {
            public string LoginUserName { get; set; }
            protected void Page_Load(object sender, EventArgs e)
            {
                if (IsPostBack)
                {
                    string userName = Request.Form["txtName"];
                    //写到Cookie中.
                    Response.Cookies["userName"].Value = Server.UrlEncode(userName);
                    Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7);
                   
                }
                else
                {
                    //读Cookie。
                    if (Request.Cookies["userName"] != null)
                    {
                        string name =Server.UrlDecode(Request.Cookies["userName"].Value);
                        LoginUserName = name;
                        Response.Cookies["userName"].Value = Server.UrlEncode(name);
                        Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7);
                    }
                }
            }
        }
    }

    电商购物车

    自动登录

    4.Cookie图例

    ****

    5.Cookie的相关问题

    1)大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。

    2)浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。

    3)有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。

    4)Cookie的另外一个创建方法:

    //另外一种创建Cookie的方式。
    HttpCookie cookie1 = new HttpCookie("cp4","sssss");
    cookie1.Expires = DateTime.Now.AddDays(3);
    Response.Cookies.Add(cookie1);

    5)多值Cookie

    Response.Cookies["userInfo"]["userName"] = "patrick";
    Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
    Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
    
    HttpCookie aCookie = new HttpCookie("userInfo");
    aCookie.Values["userName"] = "patrick";
    aCookie.Values["lastVisit"] = DateTime.Now.ToString();
    aCookie.Expires = DateTime.Now.AddDays(1);
    Response.Cookies.Add(aCookie);

     6)控制Cookie范围

    默认情况下,一个站点的全部 Cookie 都一起存储在客户端上,而且所有 Cookie 都会随着对该站点发送的任何请求一起发送到服务器。也就是说,一个站点中的每个页面都能获得该站点的所有 Cookie。但是,可以通过两种方式设置 Cookie 的范围:

    • 将 Cookie 的范围限制到服务器上的某个文件夹,这允许您将 Cookie 限制到站点上的某个应用程序。( Cookie 的 Path 属性)

    HttpCookie appCookie = new HttpCookie("AppCookie");
    appCookie.Value = "written " + DateTime.Now.ToString();
    appCookie.Expires = DateTime.Now.AddDays(1);
    appCookie.Path = "/Application1";
    Response.Cookies.Add(appCookie);
    • 将范围设置为某个域,这允许您指定域中的哪些子域可以访问 Cookie。

    Response.Cookies["domain"].Value = DateTime.Now.ToString();
    Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);
    Response.Cookies["domain"].Domain = "support.contoso.com";

    **如果要多个子域共享Cookie,则将子域中的Cookie的Domain值设置为主域的

    Response.Cookies["domain"].Value = DateTime.Now.ToString();
    Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);
    Response.Cookies["domain"].Domain = "contoso.com";

    7)读取Cookie (多值Cookie的读取)

    if(Request.Cookies["userName"] != null)
        Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value);
    
    if(Request.Cookies["userName"] != null)
    {
        HttpCookie aCookie = Request.Cookies["userName"];
        Label1.Text = Server.HtmlEncode(aCookie.Value);
    }
    if(Request.Cookies["userInfo"] != null)
    {
        Label1.Text = 
            Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]);
    
        Label2.Text =
            Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]);
    }
    if(Request.Cookies["userInfo"] != null)
    {
        System.Collections.Specialized.NameValueCollection
            UserInfoCookieCollection;
           
        UserInfoCookieCollection = Request.Cookies["userInfo"].Values;
        Label1.Text = 
            Server.HtmlEncode(UserInfoCookieCollection["userName"]);
        Label2.Text =
            Server.HtmlEncode(UserInfoCookieCollection["lastVisit"]);
    }

    8)修改和删除Cookie

    删除Cookie,实际上是修改Cookie的生存时间:

    Response.Cookies["cp2"].Expires = DateTime.Now.AddDays(-1);

    修改Cookie的本质:创建一个具有新值的新 Cookie,然后将其发送到浏览器来覆盖客户端上的旧版本 Cookie

    9)Cookie的不安全

    因为Cookie存在客户端的,所以不安全,加密!一些不重要的信息

    10)确定浏览器是否接受Cookie

    确定 Cookie 是否被接受的一种方法是尝试编写一个 Cookie,然后再尝试读取该 Cookie。如果无法读取您编写的 Cookie,则可以假定浏览器不接受 Cookie。

    第一个页面:设置一个TestCookie,然后跳转到第二个页面

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            if (Request.QueryString["AcceptsCookies"] == null)
            {
                Response.Cookies["TestCookie"].Value = "ok";
                Response.Cookies["TestCookie"].Expires =
                    DateTime.Now.AddMinutes(1);
                Response.Redirect("TestForCookies.aspx?redirect=" +
                    Server.UrlEncode(Request.Url.ToString()));
            }
            else
            {
                Label1.Text = "Accept cookies = " +
                    Server.UrlEncode(
                    Request.QueryString["AcceptsCookies"]);
            }
        }
    }

    第二个页面:

    protected void Page_Load(object sender, EventArgs e)
    {
        string redirect = Request.QueryString["redirect"];
        string acceptsCookies;
        if(Request.Cookies["TestCookie"] ==null)
            acceptsCookies = "no";
        else
        {
            acceptsCookies = "yes";
            // Delete test cookie.
            Response.Cookies["TestCookie"].Expires = 
                DateTime.Now.AddDays(-1);
        }
        Response.Redirect(redirect + "?AcceptsCookies=" + acceptsCookies,
        true);
    }

    Session

  • 相关阅读:
    sqlmap使用教程-安装教程
    SQL注入攻击总结
    mysql 创建函数失败解决办法,版本 8.0.26
    【VUE3.0体验】axios引入以及property的替代
    异化的房价周期
    vue使用websoket
    spring依赖注入方式及springBoot如何解决循环依赖
    范型的正确使用
    mysql GROUP_CONCAT使用
    Mybatis-MySQL 中使用IFNUL
  • 原文地址:https://www.cnblogs.com/youguess/p/9366868.html
Copyright © 2011-2022 走看看