Server 属性

Server属性是HttpServerUtility的一个实例,它提供对服务器上的方法和属性的访问。
在这里插入图片描述

  1. Server是上下文对象context的一个属性,是HttpServerUtility类的一个对象
  2. Server.HtmlDecode()、Server.HtmlEncode() Server.UrlEncode()、 Server.UrlDecode()是对HttpUtility类中相应方法的一个代理调用。推荐总是使用HttpUtility,因为有的地方很难拿到Server对象,而且Server的存在是为以前ASP程序员习惯而留的。别把HtmlEncode、UrlEncode混了,UrlEncode是处理超链接中的中文问题, HtmlEncode是处理html代码的。还是推荐用HttpUtility.HtmlEncode。
  3. Server.Transfer(path) 内部重定向请求,Server.Transfer(“JieBanRen.aspx”)将用户的请求重定向给JieBanRen.aspx处理,是服务器内部的接管(不能重定向到外部网站),浏览器是意识不到这个接管的,不是象Response.Redirect那样经历“通知浏览器‘请重新访问url这个网址’和浏览器接到命令访问新网址的过程”,是一次http请求,因此浏览器地址栏不会变化。因为是内部接管,所以在被重定向到的页面中是可以访问到Request、Cookies等这些来源页面接受的参数的,就像这些参数是传递给他的,而Redirect则不行,因为是让浏览器去访问的。注意Transfer是内部接管,因此不能像Redirect那样重定向到外部网站。 (常考)Response.Redirect就可以重定向到外部网站。
  4. 不能内部重定向到ashx,否则会报错“执行子请求出错”.
  5. 有的时候不能拿到HttpContext对象,比如在Global.asax中(后面讲),可以通过HttpContext.Current拿到当前的HttpContext,进而拿到Response/Request/Server等
  6. Server.MapPath。

无状态Http

  1. 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。
  2. 应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议。
  3. 一个浏览者发出的请求都是由实现了IHttpHandler接口的对象进行响应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了,写的类变量值早就不存在了,因此不要将状态信息保存到类变量中。
  4. Http协议是无状态的,不会记得上次和网页“发生了什么”。服务器不记得上次给了浏览器什么。
  5. 对网站造成的影响:如果用户录入了一些信息,当跳转到下一个页面时,数据丢失,再也不能获得那些数据。
  6. 如果要知道上一次的状态信息,我们就得把这个状态信息记录在某个地方:
  • a.服务器端
  • b.浏览器端
  • c. 表单元素中—如:隐藏域<input type=“hidden”/>(Http报文)

ASP.NET中的状态(信息)保持方案

在这里插入图片描述

常用的状态(信息)保持方式(重点)

ViewState:

  1. ASP.NET 的 .aspx页面特有,页面级的;
  2. 就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式;
  3. 服务器端控件的值都自动保存在ViewState中;

Cookie:

  1. HTTP协议下的一种方式,通过该方式,服务器或脚本能够在客户机上维护状态信息;
  2. 就是在客户端保存客户端单独使用的数据的一种方式;
  3. 就像你的病历本一样,医院直接给你带回家;

Session:

  1. 在服务器端保存客户端单独使用的数据的一种方式;
  2. 就像银行账户,钱都存在银行里,你就拿一张银行卡(SessionId)回家;

Application:

  1. 在服务器端保存共享数据的一种方式;
  2. 就像银行的单人公共卫生间,谁进去都行,但一次去一个,进去了就锁上门,出来再把锁打开;

ViewState(页面级)

  1. 使用方式: 作用域—页面级。保存数据方式:ViewState[“myKey”]=“MyData”;读取数据方式:String myData;if(ViewState[“myKey”]!=null){myData=(string)ViewState[“myKey”];}
  2. ViewState不能存储所有的数据类型,仅支持:String、Integer、Boolean、Array、ArrayList、Hashtable
  3. 使用ViewState的前提:页面上必须有一个服务器端窗体标记()
  4. 服务器在接收到用户请求一个页面后,会自动在请求报文中找看是否包含__VIEWSTATE的隐藏域,如果有,则将中间的值解码后添加到页面的ViewState属性中。
  5. 服务器在输出的时候,也会自动的将ViewState中的值添加到表单里名叫__VIEWSTATE的隐藏域中。
  6. VIEWSTATE适用于同一个页面在不关闭的情况下多次与服务器交互
  7. 跨页面提交的__VIEWSTATE不会被目标页面装入页面的ViewState属性中

ViewState图

服务器将ViewState里保存的值经过Base64编码后,自动添加到页面的隐藏域中。
使用ViewState可以方便的在服务器端将数据输出保存到客户端页面的一个隐藏域中
在这里插入图片描述

Aspx里的ViewState初探

  1. 查看生成的源代码,ASP.Net将所有隐藏内容统一放到了名字为__VIEWSTATE的隐藏字段中,使用序列化算法将所有隐藏内容放到一个字符串中。点击几次在使用ViewStateDecoder这个工具查看ViewState内容,发现了确实将这些改变的内容放到了ViewState中。存储非表单域、非value值的容器。
  2. 禁用ViewState的方法,禁用单个控件的ViewState设定enableviewstate=false,禁用ViewState以后TextBox版本不受影响。禁用整个页面的,在aspx的Page指令区加上EnableViewState=“false” 。内网系统、互联网的后台可以尽情的用ViewState。
  3. 回答ViewState原理的时候:说Input版本(TextBox)自增和Div版本(Label)的不同。(完美!!!)-- 当某些控件的某些属性不属于浏览器表单的提交范围时,fw将会把这些属性添加到ViewState中保存。
  4. WebForm的IsPostBack依赖于ViewState

Cookie(小甜饼)—病历本

  1. Cookie是一种能够让网站服务器把少量数据(4kb左右)储存到客户端的硬盘或内存,并且读取出来的一种技术。
  2. 当你浏览某网站时,由Web服务器放置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、浏览过的网页或者停留的时间等网站想要你保存的信息。当你再次通过浏览器访问该网站时,浏览器会自动将属于该网站的Cookie发送到服务器去,服务器通过读取Cookie,得知你的相关信息,就可以做出相应的动作。如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。
  3. 浏览器访问一个站点时,只将属于当前站点的Cookie发过到服务器。(根据域名)—(没必要把每家医院的病历本都带过去。)
  4. Cookie不兼容浏览器!
  5. 最好是将要保存的内容在服务器端加密(安全),为什么?
  6. 在硬盘中存放的位置与使用的操作系统和浏览器密切相关。
  7. 浏览器保存Cookie有两种方式:
    • 浏览器的内存中;
    • 浏览器所在的电脑的硬盘中。为将要写入到浏览器的Cookie对象设置失效时间:cook.Expires = DateTime.Now.AddMinutes(5);//设置cook5分钟后失效
  8. 开发场景:常用于登录和保存用户最近浏览商品
  9. 从浏览器发来的Cookie的Expires属性值是无效的.(浏览器在向服务器发送Cookie的时候,没有将Cookie的失效时间发送过去)

Cookie图

在这里插入图片描述

Cookie的操作

服务器设置Cookie:
​ HttpCookie cok = new HttpCookie(“uId”, “10001”);//(“键”,”值”)
​ cok.Expires = DateTime.Now.AddDays(18);//设置失效日期-现在之后的18天后
​ context.Response.Cookies.Add(cok); //添加到响应中

服务器获得客户端传来的Cookie:
​ string strUName=context.Request.Cookies[“uId”].Value;//从请求中获得Cookie

Cookie原理 --具体如何往返的

  1. 普通GET请求:无Cookie(图a)
  2. 服务器通过响应报文头里的set-cookie向浏览器设置Cookie信息(图b)
  3. 浏览器通过请求报文头里的Cookie传递浏览器存储的Cookie信息(图c)
    在这里插入图片描述

Cookie常见问题

  • 如果服务器两次都输出同一个名称的Cookie,浏览器会怎么办?
  • 如果服务器输出两个不同名的Cookie,浏览器怎么办?
  • 如何删除浏览器Cookie?
    补充:
  • cookie.Path(为指定的文件夹生成Cookie)
  • cookie.Domain (域/域名) www.oumind.com book.oumind.com
  • Response.Cookies和Request.Cookies中间的关系 – 有共用部分
  • Cookie在浏览器硬盘的存储位置:C:\Documents and Settings\登录帐户名\Cookies可以通过 开始-运行-cookies 自动打开。

Cookie详解

  1. 表单是和页面相关的,只有浏览器端提交了这些数据,服务器端才能得到。而有时候希望在服务端任意的地方存取一些和访问者相关的信息,这时候就不方便将这些信息保存到表单中了,因为如果那样的话必须随时注意在所有页面表单中都保存这些信息。Cookie是和站点相关的,并且每次向服务器请求的时候除了发送表单参数外,还会将和站点相关的所有Cookie都提交给服务器,是强制性的。Cookie也是保存在浏览器端的,而且浏览器会在每次请求的时候都会把和这个站点的相关的Cookie提交到服务器,并且将服务端返回的Cookie更新到硬盘,因此可以将信息保存在Cookie中,然后在服务器端读取、修改。服务器返回数据除了普通的html数据以外,还会返回修改的Cookie,浏览器把拿到的Cookie值更新本地浏览器的Cookie就可以。
  2. 哪怕请求jpg、js、css这种文件也会带着Cookie,因为服务器端可能要进行Session的操作,比如判断是否登录。互联网优化的案例:图片服务器和主站域名不一样,降低Cookie流量的传输。面试时聊网站调优
  3. 在服务器端控制Cookie案例,一个页面设置Cookie,一个页面读取Cookie
    设置值的页面:Response.SetCookie(new HttpCookie(“UserName”, TextBox1.Text));读取值的页面:Label1.Text = Request.Cookies[“UserName”].Value;
  4. Cookie的缺点和表单一样,而且还不能存储过多信息。客户端、服务器端设置的Cookie双方都能读。

Session

当会话过期或终止时,服务器就会清除 Session 对象

  1. Session提供了一种把信息保存在服务器内存中的一种方式。它能存储任何数据类型包括自定义对象。
  2. 每个客户端的Session是独立存储。
  3. Session 对象用于存储有关用户的信息。
  4. 在整个用户会话过程中都会保留此信息。(保存SessionId的cookie丢失之前)
  5. 当用户在应用程序中从一个网页浏览到另一个网页时,存储在 Session 对象中的变量不会被丢弃。
  6. Session只可由该会话的用户访问(因为SessionId的东东以cookie的方式保存访问者浏览器的缓存里了)
  7. 用户不能访问或修改他人的Session

Session图

在这里插入图片描述

Session的操作

  1. 开始并为Session赋值:Session[“uName”]=“CNYaoMing”;
  2. 取值:string strName = Session[“uName”].ToString();
  3. 销毁(取消/退出):Session.Abandon();//销毁服务器端的Session对象 Session.Clear();//清空服务端的Session对象里的键值对,Session对象并没有从Session池里销毁

Session常用属性、方法

  1. SessionID:唯一用户会话标识符
  2. TimeOut:用户超时(单位:分钟),默认20分钟
  3. Count:会话状态集合中的项目数
  4. Abandon方法:用于显式结束会话

Session详解

  1. ASP.Net已经内置了Session机制。不要放太多的对象到Session(因为存储在服务器端fw的一个辅助进程里,不稳定,数据多了容易丢失。),Session会有超时销毁的机制,发帖(服务器不可能知道浏览器是否在开着,什么时候关闭),发帖计时,在线时间统计,靠请求来判断是否活着。Cookie是存在客户端,Session是存在服务器端,目的是一样的:保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session、Cookie)。不能放太大的数据,放的数据是object。如果浏览器禁用了Cookie可以启用Url来传递SessionID。
  2. 可以看到Session机制并不是Http协议规定的,是ASP.net实现的,现在PHP、JSP等大部分服务端技术都实现了Session,原理都差不多。
  3. Session有自动销毁机制(设置失效时间,默认就是滑动过期机制),如果一段时间内浏览器没有和服务器发生任何的交互,则Session会定时销毁。
  4. 案例:Session实现登录,登录以后才能看一些内容。
  5. 案例:用Session实现验证码。HttpHandler要能够操作Session,要实现IRequiresSessionState接口。为什么每次点击值都变化?很正常,因为每次页面点击页面都会刷新,就向ashx重新请求图片,ashx的ProcessRequest都会执行。正常网站登录成功就进入主页面,没机会让你看到变化,但是一旦输入错误也是变化。
  6. 点击图片产生新的验证码。 <img src=“YZM.ashx” οnclick=“this.src=‘YZM.ashx?aaa=’+new Date()” />每次点击都生成一个新的地址,让浏览器去请求。在AJAX中还会用。
  7. 问题:为什么页面中能显示验证码的图片。用“动态绘制趣味图片”的例子讲解。

Application对象

Application对象可以存储应用程序级的数据。

  1. “Application”:应用程序
  2. 第一个用户访问站点时,应用程序启动,并创建一个Application对象。
  3. 创建成功后,整个应用程序中都可以使用该对象。
  4. 除非应用程序关闭,否则对象一直存储在内存中。

系统对象

  1. Request对象:读取客户端在Web请求期间发送的值
  2. Response 对象:封装了页面执行期返回到HTTP客户端的输出
  3. Application对象:作用于整个程序运行期的状态对象(保存网站共享数据)
  4. Session 对象:会话期状态保持对象,用于跟踪单一用户的会话 (安全)
  5. Cookie 对象:客户端保持会话信息的一种方式(相对类说对安全要求不高的时候使用)
  6. Server 对象:提供对服务器上的方法和属性的访问
posted on 2019-05-05 14:53  豆皮没有豆  阅读(148)  评论(0)    收藏  举报