无状态的http协议

1.回顾http协议

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

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

前文链接:

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

2.案例、弊端

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

 //html:
<form action="IncLabel.ashx" method="post">
<input type="text" name="i" value="@i" />
<input type="submit" name="btn1" />
</form>
//ashx:
int i = ;
if (!string.IsNullOrEmpty(context.Request["btn1"]))
{
i = Convert.ToInt32(context.Request["i"]);
i++;
}
string html = HtmlFileLoader.Load("~/IncLabel.html");
html = html.Replace("@i", i.ToString());
context.Response.Write(html);
这个案例中,html像ashx发出请求。提交按钮无论点击多少次,页面都只会显示  1。而不会继续增长。

Http协议不会记得上次和网页“发生了什么"。服务器不记的上次给了浏览器什么,否则服务器的压力会太大。每次请求到达asp.net,都创建一个HttpHandler的新对象来处理。

但是现实开发中经常遇到这样的需求。如何解决这个矛盾呢?

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

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

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

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

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

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

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

认识Cookie

1.Cookie存贮位置

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

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

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

2.读取、设置Cookie

设置值的页面:

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

读取值的页面:

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

3.Cookie的失效时间

        //DateTime的AddDays就是在这个DateTime的基础上增加20天,返回新的DateTime对象
//如果不设定Expires超时时间,则关闭浏览器后Cookie失效
//如果设定Expires,则即使关闭浏览器,除非到期,否则再次打开浏览器,还能读取
cookie.Expires = DateTime.Now.AddDays();
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/

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

Cookie详解、ASP.NET核心知识(7)的更多相关文章

  1. Session详解、ASP.NET核心知识(8)

    介绍一下Session 1.作用 Cookie是存在客户端,Session是存在服务器端,目的是一样的:保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session). 在本篇博文的姊妹篇 ...

  2. ASP.NET 操作Cookie详解 增加,修改,删除

    ASP.NET 操作Cookie详解 增加,修改,删除 Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密).定义于RFC2109.它 ...

  3. cookie详解(含vue-cookie)

    今天看到一篇cookie的文章,写的特别详细,感谢 晚晴幽草轩 的分享,原文链接http://mp.weixin.qq.com/s/NXrH7R8y2Dqxs9Ekm0u33w 原文如下,记录到此供以 ...

  4. [转]Cookie详解

    从事 Web 开发已有近17个月:在学以致用的工作学习里,对于不怎么使用的部分,多少有些雾里探花的窘迫感-差不多是了解一二,然而又非真切的明晰:这就使得再用的时候,总要去再搜索一番:如此颇为难受,倒不 ...

  5. 详解ASP.NET MVC 控制器

    1   概述 在阅读本篇博文时,建议结合上篇博文:详解ASP.NET MVC 路由  一起阅读,效果可能会更好些. Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务端的 ...

  6. Cookie的使用、Cookie详解、HTTP cookies 详解、获取cookie的方法、客户端获取Cookie、深入解析cookie

    Cookie是指某些网站为了辨别用户身份.进行session跟踪而存储在用户本地终端上的数据(通常经过加密),比如说有些网站需要登录才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么我 ...

  7. Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)

    Java web Cookie详解 啥是cookie? 查询有道词典得: web和饼干有啥关系? 这个谜底等等来为大家揭晓 会话技术 web中的会话技术类似于生活中两个人聊天,不过web中的会话指的是 ...

  8. session及cookie详解(七)

    前言 文章说明 在每整理一个技术点的时候,都要清楚,为什么去记录它.是为了工作上项目的需要?还是为了搭建技术基石,为学习更高深的技术做铺垫? 让每一篇文章都不是泛泛而谈,复制粘贴,都有它对自己技术提升 ...

  9. cookie详解

    一.cookie详解 (1)设置cookie 每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie: document.cookie="userId ...

随机推荐

  1. PAT 甲级 1126 Eulerian Path

    https://pintia.cn/problem-sets/994805342720868352/problems/994805349851185152 In graph theory, an Eu ...

  2. IPV6 简单验证

    1. 网络路由器的分类 .通常将网络中直接面向用户连接或访问网络的部分称为接入层,接入层目的是允许终端用户连接到网络,因此接入层交换机具有低成本和高端口密度特性: .将位于接入层和核心层之间的部分称为 ...

  3. SQL利用Case When Then多条件

    CASE    WHEN 条件1 THEN 结果1    WHEN 条件2 THEN 结果2    WHEN 条件3 THEN 结果3    WHEN 条件4 THEN 结果4.........    ...

  4. Spring Boot快速搭建Spring框架

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development a ...

  5. VM ware 中win2008 找不到网卡驱动的解决办法之一

    在.vmx文件中用如下语句指定: ethernet0.virtualDev = "e1000" 其值为e1000指定网卡类型为Intel(R) PRO/1000(6.5默认为此项) ...

  6. swift网络数据请求方法

    搭建一个apache服务器,用php编写一个返回给客户端请求数据的脚本 <?php // header("Content-type:text/html;charset=utf-8&qu ...

  7. 【HDU5469】Antonidas(点分治,字符串哈希)

    [HDU5469]Antonidas(点分治,字符串哈希) 题面 HDU Vjudge 题解 啊哈?什么垃圾一眼点分治+Hash判断,哈哈哈哈哈,让我来码码码. 诶,怎么WA了.改改改改改. 诶,怎么 ...

  8. linux内核设计与实现一书阅读整理 之第五章

    CHAPTER 5 系统调用 5.1 与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个: 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进 ...

  9. Solr7.2的安装与使用

    单机安装Solr服务: https://www.cnblogs.com/LUA123/p/7906774.html extend: install_solr_service.sh 参数说明: 安装脚本 ...

  10. Jenkins(三)---Jenkins初始配置和插件配置

    从Jenkins(二)中可以知道 jenkins 的工作目录为/opt/jenkins [很重要!!!][很重要!!!][很重要!!!]在配置此目录以前,将这两台的主机进行配置为ssh root用户无 ...