Http是请求,响应的模型,服务器不会来读取浏览器的网页,只能够得到客户端提交过来的数据
当用户点击提交,服务器就知道"提交回来了"(PostBack)

Get与Post

设置form的method属性指定表单提交方式,get(默认值)是通过URL传递值,传递的数据量是有限的
post传递的表单值是隐藏到http报文中,URL中看不到,会有浏览器提示重新提交表单的问题,get没有
Get方式URL数据格式,服务端文件名跟着"?",由于客户端可能向服务器端提交多个键值对,
键值对之间用"&"进行分割,如果URL中有汉字,特殊符号等,则需要对URL进行编码
表单域只有设定了name的才会被提交给服务器

网页只有设定了name的input,textarea,select的value属性值才会被提交给服务器
非表单元素无法将值传递给服务器的
如:要设置DIV的值,直接是不行的,可以通过隐藏字段实现,将隐藏字段的value与DIV的内容设置成一样
然后当用户提交信息,服务器获得隐藏字段的值,并把值 替换掉网页所有的 value

如果指定from 表单method属性为get,那么在 action=1.ashx?a=123的参数就会被删除
如如果指定为post,那么action中的参数就会被提交到服务器来

ViewState 原理 (对于上面问题的解决办法)

Label版本的值存到了ViewState中,TextBox版本的不用存,因为TextBox就是Input,自己就会提交给服务器,不需要隐藏字段.
用于asp.net重写DIV文本自增(还要同时递增Label的宽度,注意Width的单位)
Label1.Text = (Convert.ToInt32(Label1.Text)+1).ToString();
Label1.Width = new Unit(Label1.Width.Value + 10);
查看生成的源代码,ASP.net将所有隐藏内容统一放到了名字为__VIEWSTATE的隐藏字段中,使用序列化
算法将所有隐藏的内容放到一个字符串中,点击几次在使用ViewStateDecoder这个工具查看ViewState
内容,发现确实将这些改变的内容放到了ViewState中

禁用ViewState的方法:在页面最上面 Page标签 加入 EnableViewstate="false",禁用ViewState以后
TextBox版本不受影响,DIV版本受影响,因为input的value不依靠ViewState(可以禁用单个控件)
禁用ViewState后并不是完全去掉ViewState,还会有一小段代码,如果想在页面中完全没有ViewState
那么在页面中就不能有 runat=server的form,如果Button等服务端控件没有放到runat=server的form
中,那么则是不用的

回答ViewState原理的时候说:input版本(TextBox)自增和DIV版本(Label)的不同

--------- ViewState 使用:

     // 在后台为 ViewState 赋值
this.ViewState["key"] = "";
this.ViewState.Add("key2", ); // 调用 ViewState
Label1.Text = this.ViewState["key"].ToString();

只要有runat=server的form就会产生 _VIEWSTATE等,所以去掉form的runat=server,这样除了Repeater等少数控件之外服务端控件都没法使用,只能使用html标签。
这是为什么说"要求高的互联网项目不用服务端控件"

无状态HTTP

1.HTTP协议是无状态的,不会记得上次和网页"发生了什么",如果要知道上一次的状态,
一个方法就是在对浏览器响应结束之前将状态信息保存到页面表单中,下次页面再向服务器发出请求的
时候带上这些状态信息,这样服务器就能根据这些状态信息还原上次的状态了
2.状态信息保存在隐藏字段中的缺点:加大网站的流量,降低访问速度,机密数据放到表单中会有数据欺骗等安全问题

原因:HTTP是用的TCP协议,为了降低服务器的消耗,当服务器响应完客户端后,就立马段掉,所以无状态

ASP.NET保存状态有以下几种:

Application 当前应用程序(所有用户使用一个Application)
Session 当前会话(每个用户一个会话)
Cookie 保存在客户端的
ViewState 针对当前页面(每个页面有一个ViewState)

一、Application 对象

Application是全局的,保存与操作都放在服务器端,任何人都能访问

使用 object 保存
this.Application["t1"] = TextBox1.Text;
Application.Lock(); //锁定
Application.UnLock(); //解锁

可以在 Global.asax 中对网页的访问量,点击量 做一些统计

二、Cookie的使用

Cookie存在客户端
Cookie是和站点相关的,并且每次向服务器请求的时候除了发送表单参数外,还会将和站点相关的所有
Cookie都提交给服务器,是强制性的,Cookie也是保存在浏览器端的,而且浏览器会在每次请求的时候都
会把和这个站点相关的Cookie提交到服务器,并将服务端返回的Cookie更新回数据库,因此可以将信息
保存Cookie中,然后在服务器端读取,修改.
服务器返回数据除了普通的html数据以外,还会返回修改后的Cookie,浏览器把拿到的Cookie值更新本地
浏览器的Cookie就可以

设置:

Response.SetCookie(new HttpCookie("Color",TextBox1.Text));

Response.Cookies.Add(new HttpCookie("Size",""));

读取:

Lable1.Text = Request.Cookies["Color"].Value;

扩展使用:

HttpCookie h1 = new HttpCookie("Color", TextBox1.Text);    //创建一个Cookie对象
h1.Expires = DateTime.Now.AddHours(); //设置过期时间,只能用DateTime格式
h1.HttpOnly = true; //设置客户端是否能够访问脚本
Response.SetCookie(h1); //设置Cookie
Response.AppendCookie(); //追加Cookie

Cookie的缺点和表单一样,不能存储过多的信息.

网站优化案例:
网站的图片服务器要与主站域名不一样,降低Cookie流量的传输
注意:图片,CSS,JS等静态文件,都是单独请求中

如果一个网站有 多个图的话,本地又有那个网站的 cookie 的话,
那么访问时,请求HTML 有传一次 Cookie, 请求每张图片都要再传 cookie ,这样就浪费了。。
如果设置 图片服务器的域名和 主站的不一样的话,当下载图片的时候就不会传 cookie 了,
因为 cookie 是不可以跨域的!!

三、Session原理

Session存放在服务器端,存放的是object类型
private int i = 0; //每次请求来了都会new一个新的实现了IHttpHandler接口的类"变量"的实例,
进行处理,用完了就GC掉,所以不会保持上次的值,所以不会自增
private static int j = 0; // static不会被实例化,所有访问者都访问同一个J的实例,
仍然保存上次的值,所以会自增
Cookie不能存储过多信息,如果想保存大量的数据,可以保存一个Guid到Cookie中,然后在服务器中建立一个以Guid为Key,复杂数据为Value全局Dictionary,static 字段对于不同用户也只有一份,

因此用static实现多用户共享数据,代码如下:

public class sessionMgr        //session管理页面
{
private static IDictionary<string,IDictionary<string, object>> data = new Dictionary<string,IDictionary<string,object>>();
public static IDictionary<string, object> GetSession(string sessionId)
{
if (data.ContainsKey(sessionId))
{
return data[sessionId];
}
else
{
IDictionary<string, object> session = new Dictionary<string, object>();
data[sessionId] = session; //为data增加value ,sessionId为KEY,session为value
return session;
}
}
} protected void Page_Load(object sender, EventArgs e) //加载事件
{
if (Request.Cookies["MySessionId"] == null) //判断是否有MySessionId,没则增加
{
string sessionId = Guid.NewGuid().ToString();
Response.SetCookie(new HttpCookie("MySessionId", sessionId));
} }
protected void btus_Click(object sender, EventArgs e) //设置Session单击事件
{
string sessionId = Request.Cookies["MySessionId"].Value;
IDictionary<string, object> session = sessionMgr.GetSession(sessionId);
session["服务端的数据"] = DateTime.Now; //添加键值
}
protected void butd_Click(object sender, EventArgs e) //读取Session单击事件
{
string sessionId = Request.Cookies["MySessionId"].Value;
IDictionary<string, object> session = sessionMgr.GetSession(sessionId);
butd.Text = Convert.ToString(session["服务端的数据"]);
}

ASP.net已经内置了Session机制,把上面的例子用ASP.NetSession重写,
注意:不要放太多的对象到Session,Session会有超时销毁的机制
可以看到Session机制并不是HTTP协议规定的,是ASP.NET实现的,现在PHP,JSP等大部分服务端技术都
实现了Session,原理都差不多
如果当用户禁用了 Session ,可以在 Web.conf 中的 <system.web>里面增加属性,使得将SeesionID保存到 URL 中,<sessionState cookieless="UseUri" />

ASP.NET内置的 Session

Session["one"] = DateTime.Now;            //设值
Label1.Text =Convert.ToString(Session["one"]); //取值

HTTP中Get与Post、ViewState 原理的更多相关文章

  1. 学习重点:1、金典的设计模式在实际中应用2、JVM原理3、jui源代码

    学习重点:1.金典的设计模式在实际中应用 2.JVM原理 3.jui源代码

  2. Spring中EmptyResultDataAccessException异常产生的原理及处理方法

    Spring中EmptyResultDataAccessException异常产生的原理及处理方法 Spring中使用JdbcTemplate的queryForObject方法,当查不到数据时会抛出如 ...

  3. 基于接口回调详解JUC中Callable和FutureTask实现原理

    Callable接口和FutureTask实现类,是JUC(Java Util Concurrent)包中很重要的两个技术实现,它们使获取多线程运行结果成为可能.它们底层的实现,就是基于接口回调技术. ...

  4. Spring框架中IoC(控制反转)的原理(转)

    原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...

  5. [置顶] Hadoop2.2.0中HDFS的高可用性实现原理

    在Hadoop2.0.0之前,NameNode(NN)在HDFS集群中存在单点故障(single point of failure),每一个集群中存在一个NameNode,如果NN所在的机器出现了故障 ...

  6. Oracle中的SQL分页查询原理和方法详解

    Oracle中的SQL分页查询原理和方法详解 分析得不错! http://blog.csdn.net/anxpp/article/details/51534006

  7. Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...

  8. Java中的HashMap的工作原理是什么?

    问答题23 /120 Java中的HashMap的工作原理是什么? 参考答案 Java中的HashMap是以键值对(key-value)的形式存储元素的.HashMap需要一个hash函数,它使用ha ...

  9. Spring.Net是怎么在MVC中实现注入的(原理)

    本文将介绍Spring.Net(不仅仅是Spring.Net,其实所有的IoC容器要向控制器中进行注入,原理都是差不多的)在MVC控制器中依赖注入的实现原理,本文并没有关于在MVC使用Spring怎么 ...

随机推荐

  1. ehcache在windows下使用RMI同步时出现的问题

    问题 最近的项目由于OP分配的机器没有配Redis或Mem,为了解决tomcat的集群问题,项目使用了Ehcache作为缓存.Ehcache使用RMI进行同步,但在本地测试时出现了缓存未同步的问题.最 ...

  2. glusterfs 术语

    Access Control Lists Access Control Lists (ACLs) allows you to assign different permissions for diff ...

  3. 群赛 ZOJ3741(dp) ZOJ3911(线段树)

    zoj3741 简单dp.wa了两个小时,中间改了好多细节.后来还是不对,参考了别人的代码,发现一个致命问题,初始化的时候,不是每种状态都能直接达到的.初始化成-1. (题目有个小坑,0<=L& ...

  4. 迷宫 (BFS)

    <挑战程序设计> P34 第一次使用pair 1.头文件:<utility>2.成员:mypair.first, mypair.second3.运算符:<.>.&l ...

  5. android 控件花屏问题

    发现自己的手机上某个界面出现了花屏,某些控件背景被拉伸过多遮住了其他控件,很难看.这种现象高概率出现,分析了下发现:一旦发生这种现象,必然 会打印下面这种log,google了下,这种log应该是硬件 ...

  6. careercup-递归和动态规划 9.9

    9.9 设计一种算法,打印八皇后在8*8棋盘上的各种摆法,其中每个皇后都不同行.不同列,也不在对角线上.这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线. 类似leetcode:N ...

  7. AIR lame参数配置

    -Duser.name=Z.yu 固定码率的例子:=======================================================================固定码率 ...

  8. html5标签兼容ie6,7,8

    注册博客园已经三年了,这三年一直在忙,没时间写博文.也许是忙,也许是懒吧!当然这三年发生了很多事,我也从开发人员转变为前端人员. 是时候对所学的,所用的知识做一下沉淀了.就从这一篇开始吧! html5 ...

  9. Ubuntu14.04 固定IP

    Ubuntu 固定IP 1. 更改/etc/network/interfaces的内容 1.1 注释掉原来的内容 1.2 添加以下内容 auto eth0 iface eth0 inet static ...

  10. redhat 6.4 双网卡绑定

    linux系统配置 1.redhat 6.4 双网卡绑定 1)#ethtool eth* //在服务器网口接网线至笔记本,确定各网口的配置文件: 2)切换目录 #cd /etc/sysconfig/n ...