zoukankan      html  css  js  c++  java
  • Cookie详解、ASP.NET核心知识(7)

    无状态的http协议

    1.回顾http协议

    Http协议是请求响应式的,有请求才有响应,是无状态的,不会记得上次和网页“发生了什么”。

    关于http协议的这种特点,黑兔在前面的这三篇博文中进行了详细的阐述。感兴趣的童鞋们可以去吐槽。

    前文链接:

    关于Http协议、            ASP.NET 心知(2

    2.案例、弊端

    说过了http协议的特性,接下来举一个简单的例子,来引出我们得矛盾。

     1 //html:
     2     <form action="IncLabel.ashx" method="post">
     3         <input type="text" name="i" value="@i" />
     4         <input type="submit" name="btn1" />
     5     </form>
     6 //ashx:
     7      int i = 0;
     8      if (!string.IsNullOrEmpty(context.Request["btn1"]))
     9      {
    10           i = Convert.ToInt32(context.Request["i"]);
    11           i++;
    12      }
    13      string html = HtmlFileLoader.Load("~/IncLabel.html");
    14      html = html.Replace("@i", i.ToString());
    15      context.Response.Write(html);
    View Code
    这个案例中,html像ashx发出请求。提交按钮无论点击多少次,页面都只会显示  1。而不会继续增长。
    clipboard Http协议不会记得上次和网页“发生了什么"。服务器不记的上次给了浏览器什么,否则服务器的压力会太大。每次请求到达asp.net,都创建一个HttpHandler的新对象来处理。
    但是现实开发中经常遇到这样的需求。如何解决这个矛盾呢?

    3.如何进行状态的传递和保存

    对于如何进行服务器/浏览器之间的状态保存呢? 我这里有两个答案。

    1)把信息记录在页面保单中

    对浏览器响应结束之前将状态信息保存到页面表单中,下次页面再向服务器发出请求的时候带上这些状态信息,这样服务器就能根据这些状态信息还原上次的状态了,类似于去看病的病历本。如果觉得显示出来这个form对象不合适,就把这个input设置成隐藏。

    这就是webform的做法,用起来很方便,但是html会很臃肿。

    2)利用Cookie、Session等状态保存的机制

    说了这么多,我们接下进入正题,来说Cookie

    认识Cookie

    1.Cookie存贮位置

    Cookie存储在浏览器端,对于设置了Cookie的站点,

    浏览器会通过http请求报文的方式,把本机的Cookie信息,发送给服务器。

    clipboard[1]

    而服务器,会对Cookie进行设置。并通过响应报文返回给浏览器。

    clipboard[2]

    2.读取、设置Cookie

    设置值的页面:

            Response.SetCookie(new HttpCookie("UserName", username));

    读取值的页面:

            string username= Request.Cookies["UserName"].Value;

    3.Cookie的失效时间 

    1        //DateTime的AddDays就是在这个DateTime的基础上增加20天,返回新的DateTime对象
    2        //如果不设定Expires超时时间,则关闭浏览器后Cookie失效
    3        //如果设定Expires,则即使关闭浏览器,除非到期,否则再次打开浏览器,还能读取
    4         cookie.Expires = DateTime.Now.AddDays(20);
    5         context.Response.SetCookie(cookie);

       值得注意的是,Expires设置的内容类似于保质期到2015/4/23。而不是保质期一个月。你知道我什么意思的!

    4.键值对存储

    new HttpCookie("UserName", username)。//应该不用多说

    其实还有含值键值对,文章后面写一下,但是坦率的说我没用过。

    Cookie路径问题

    1.Path

    path表示cookie所在的目录,

    a)默认“/”

    asp.net默认为/,就是根目录。如果要整个域名都可以访问,就要设置Path为“/”。

    b)为空

    Path为空,则只有当前页面所在目录的页面能够读取,子文件夹都不行。

    c)细说路径问题

    在同一个服务器上有目录如下:/web/path1/、/web/path2/

    clipboard[3]

    2.Domain

    domain表示的是cookie所在的域(域名)

    1)默认

    默认为请求的地址,如果为www.baidu.com/test/test.aspx,那么domain默认为www.baidu.com

    但是默认domain的cookie无法跨域访问。例如 teiba.baidu.com,无法访问cookie。

    2)跨域名的domain

    如果想让一个站点的所有子域名都可以访问一个cookie。

    例如  tieba.baidu.com 和 www.baidu.com。

    这时就要设置 domain为 ".baidu.com"。

    ps:浏览器会将domain和path都相同的cookie保存在一个文件里,cookie间用*隔开。

     

    3.含值键值对 

    含多个子键值对的cookie格式是name=key1=value1&key2=value2。

    可以理解为单键值对的值保存一个自定义的多键值字符串,其中的键值对分割符为&,当然可以自定义一个分隔符,但用asp.net获取时是以&为分割符。

    Cookie的缺陷

    1.信息量小、不安全

    还不能存储过多信息,机密信息不能存(不要把不希望用户看到的或者不能被用户篡改的信息放到Cookie)。

    2.可能被清楚

    Cookie:是可以被清除,不能把不能丢的数据存到Cookie中,也许没到Expires就已经过期了。

    3.不能跨浏览器

    Cookie无法跨不同的浏览器;浏览器的“隐私模式/小号模式”。

    本文的姊妹篇Session

     

     

  • 相关阅读:
    ABP(现代ASP.NET样板开发框架)系列之4、ABP模块系统
    ABP(现代ASP.NET样板开发框架)系列之3、ABP分层架构
    ABP(现代ASP.NET样板开发框架)系列之2、ABP入门教程
    ABP(现代ASP.NET样板开发框架)系列之1、ABP总体介绍
    基于DDD的现代ASP.NET开发框架--ABP系列文章总目录
    参加博客园DDD交流会的情况和感想
    新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序(续1)
    【python】使用openpyxl解析json并写入excel(xlsx)
    [leetcode]multiply-strings java代码
    线性回归,感知机,逻辑回归(GD,SGD)
  • 原文地址:https://www.cnblogs.com/mcad/p/4360524.html
Copyright © 2011-2022 走看看