1 ASP.NET HTTP协议
1.1 什么是HTTP协议
HTTP(Hyper Text Transfer Protocol):超文本传输协议,Http协议就是将超文本标记语言的文档(即Html文档)从web服务传送到客户端的浏览器。
在TCP/IP体系结构中,HTTP属于应用层协议,位于TCP/IP协议的顶层。浏览Web时,浏览器通过HTTP协议与Web服务器交换信息。
1.1.1 一个基于应用层的通信规范
HTTP按客户/服务器模式工作 HTTP支持客户(一般情况是浏览器)与服务器的通讯,相互传输数据。 HTTP定义的事务处理由以下四步组成:
- 客户与服务器建立连接;
- 客户向服务器提出请求;
- 如果请求被接受,则服务器送回响应,在响应中包括状态码和所需的文件;
- 客户与服务器断开连接
1.1.2 Http协议的几个概念
- 连接(Connection):浏览器和服务器之间传输数据的通道。 一般请求完毕就关闭,http不保持连接。不保持连接会降低处理速度(因为建立连接速度很慢),保持连接的话就会降低服务器的处理的客户端请求数,而不保持连接服务器可以处理更多的请求。
- 请求(Request):浏览器向服务器发送的“我要***”的消息,包含请求的类型、请求的数据、浏览器的信息(语言、浏览器版本等)。
- 响应(Response):服务器对浏览器请求的返回的数据,包含是否成功、状态码等。
1.1.3主要特点
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
- 支持B/S及C/S模式。
1.2 HTTP协议消息结构图
1.3HTTP协议-请求报文格式
1.4 HTTP协议-请求报文
- 用httpwatch查看访问一个网站的响应情况。敲入一个网址后,浏览器向服务器发出请求。页面中的图片、js、css在单独的请求中。
- GET / HTTP/1.1表示向服务器用GET方式请求首页,使用HTTP/1.1协议
- Accept-Encoding gzip, deflate表示浏览器支持gzip、deflate两种压缩算法
- Accept-Language zh-cn 表示浏览器支持的语言,很多进入后自动就是中文界面的国际网站就是通过读取这个头的值实现的。
- Connection Keep-Alive。一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了Connection:keep-alive,则TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
- Cookie是浏览器向服务器发送和当前网站关联的Cookie,这样在服务器端也能读取浏览器端的Cookie了。
- User-Agent为浏览器的版本信息。通过这个信息可以读取浏览器是IE还是FireFox、支持的插件、.Net版本等。
1.5 HTTP协议-响应报文格式
1.6 HTTP协议-响应码
浏览器向服务器发出请求,服务器处理可能是成功、可能是失败、可能没有权限访问等原因,服务器会通过响应码来告诉浏览器处理结果。
- "200" : OK
- "302" : Found 重定向.
- "400" : Bad Request 错误请求,发出错误的不符合Http协议的请求
- "403" : Forbidden 禁止
- "404" : Not Found 未找到。演示访问一个不存在的页面看报文
- "500" : Internal Server Error 服务器内部错误。演示页面抛出异常。
- "503" : Service Unavailable。一般是访问人数过多。
1.7 HTTP协议-服务器返回的报文
- Server: Cassini/3.5.0.5 表示服务器的类型
- Content-Type: text/html; charset=utf-8 表示返回数据的类型
- 服务器通过Content-Type告诉客户端响应的数据的类型,这样浏览器就根据返回数据的类型来进行不同的处理,如果是图片类型就显示,如果是文本类型就直接显示内容,如果用html类型就用浏览器显示内容,如果是下载类型就弹出下载工具等。
- 常用Content-Type:text/HTML、image/GIF、image/JPEG、text/plain、text/javascript、application/x-excel 、application/octet-stream(二进制文件)
- Content-Length: 19944表示响应报文体的字节长度,报文头只是描述,返回的具体数据(比如HTML文本、图片数据等)在两个回车之后的内容中。
1.8 Http协议-其他
- http是无状态的,不会记得“上个请求***”,所以哪怕是同一个页面中的js、css、jpg也都要重复的提交Accept-Language、Accept-Encoding、Cookie等。
- 网页中如果有图片、css、js等外部文件的话图片、css、js都在单独的请求中,也就是并不是页面的所有内容都在一个请求中完成,而是每个资源一个请求。
- 一般情况下,只有浏览器请求服务器端,服务器端才有给浏览器响应数据,服务器不会主动向浏览器推送数据,这样是安全考虑,也是提高服务器的性能考虑。如果要服务器向浏览器推送数据,则需要使用ServerPush(ajax隔一段时间到服务器请求最新的数据)等额外的技术。
- Http是“请求—响应”的工作方式。
可参考:https://www.cnblogs.com/ranyonsue/p/5984001.html
2 ASP.NET
2.1 服务器与浏览器语言
2.1.1 浏览器与服务器语言
- 浏览器只负责解释执行html+css+javascript代码
- 服务器可执行服务器端语言:.NET,JAVA,...,分别由不同的运行
- 环境执行代码(Framework,JVM)
2.1.2 静态页面(html)和动态页面(aspx)的区别?
1. 静态页面(HTML(htm)文件):是指没有后台数据库、不含程序和不可交互的网页。运行于客户端的程序、网页、插件、组件,属于静态网页。你编的是什么它显示的就是什么、不会有任何改变。(任何时候访问看到的都是一样的界面。)
2. 动态页面(aspx(asp)):使用html+ASP,html+aspx或html+php的组合。在服务器端运行的程序、网页、组件,属于动态网页。(不同条件和时候访问看到的界面也不同。)
具体可参考:https://blog.csdn.net/u010955843/article/details/41808249
2.2 请求流程图
2.3 什么是ASP.Net
- ASP.Net是一种动态网页技术,在服务器端运行.Net代码,动态生成HTML,然后响应给浏览器。
- 可以使用JavaScript、Dom在浏览器端完成很多工作,但是有很多工作无法在浏览器端完成,比如存储数据、访问数据库、复杂的业务逻辑运算、安全性要求高的逻辑运算等。
- ASP.Net:一般处理程序(ashx),WebForm(aspx)、MVC(Model, View , Controler)。
2.4 ASP.NET里的常用文件
- .ashx一般处理程序,ASP.NET核心程序,但一般使用.aspx
- .aspx常用程序WebForm,用于创建网页和对网页进行编程的核心文件类型(前台文件_html,就相当于是Html模板页面),和.aspx.cs文件配套使用。里面主要存放HTML等浏览器代码
- .aspx.cs常用程序,用于编写大量的c#业务代码,和.aspx配套使用。
- .ascx指明一个 ASP.NET 用户定义控件
- .asax包含 ASP.NET 应用程序级事件的事件语法
- .config配置文件,用于设置网站应用程序的各种属性
- .asmx供宿主 Web 服务在本地或远程使用
2.5 一般处理程序(HttpHandler)
一般处理程序:一般情况下,凡是不需要返回大量复杂的HTML代码的时候,可以使用它。 HTTPhandlers 类似于一种 ISAPI(Internet Server Application Programming Interface)扩展程序. HTTPhandlers与ISAPI extensions的一个不同点是HTTP handlers可以被直接通过URL中请求的文件名来调用。ISAPI 服务器扩展是可以被 HTTP 服务器加载和调用的程序集(DLL)。用于增强符合 Internet 服务器 API (ISAPI) 的服务器的功能。
2.5.1 一般处理程序(HttpHandler):
- 是一个实现System.Web.IHttpHandler接口的特殊类。
- 任何一个实现了IHttpHandler接口的类,是作为一个外部请求的目标程序的前提。(凡是没有实现此接口的类,就不能被浏览器请求。)
- 它由支持ASP.NET的服务器调用和启动运行。一个HttpHandler程序负责处理它所对应的一个或一组URL地址的访问请求,并接收客户端发出的访问请求信息(请求报文)和产生响应内容(响应报文)。
- 可以通过创建一个我们自己的HttpHandler程序来生成浏览器代码发送回客户端浏览器。
2.5.2 HttpHandler程序可以完成普通类程序所能完成的大多数任务:
- 获取客户端通过HTML的Form表单提交的数据和URL参数
- 创建对客户端的响应消息内容
- 访问服务器端的文件系统
- 连接数据库并开发基于数据库的应用
- 调用其他类
2.6 请求响应的过程
1. 用户在浏览器地址栏输入:http://localhost:80777/FirstShower.ashx
2. 服务器接收到用户的请求,发现是请求.ashx文件,便将请求交给framework执行,服务找到对应的文件first.ashx,执行后将生成的字符串(通常是html+css+javascript格式)返回给浏览器。
3. 浏览器接收到服务器返回的数据,并按照http语法解释执行,以界面的方式展示给用户看到(此时如果html等代码中包含外部文件,则再次发送单独请求服务器相应文件数据)。
2.7 HTTP请求详解图
2.8 ASP.NET系统对象
在一般处理程序里,通过ProcessRequest方法的参数HttpContext context调用
- Page指向页面自身的方式。作用域为页面执行期。
- Request读取客户端在Web请求期间发送的值(http请求报文数据)
- Response封装了页面执行期返回到HTTP客户端的输出(http响应报文数据)
- Application作用于整个程序运行期的状态对象
- Session会话期状态保持对象,用于跟踪单一用户的会话。
- Cookie客户端保持会话信息的一种方式
- Server提供对服务器上的方法和属性的访问
2.9 Request(HttpRequest) & Response(HttpResponse)
2.9.1 浏览器提交数据方式
-
表单:(数据藏在请求报文体中,格式:txtname=james&txtpwd=123)
<form action=“login.ashx” method=“post”> <input type=“text” name=“txtname” /> <input type=“password” name=“txtpwd”/> </form>
注意:使用表单提交时必须为控件设置name -
地址栏的URL参数,超链接的url,js指定的url(和表单的Get方式一样):键值对
2.9.2 服务器如何获取浏览器提交的数据
浏览器请求属性
- 获取POST数据:context.Request.Form[“txtname”]
- 获取GET参数:context.Request.QueryString[“txtname1”]
2.9.3 注意
当我们点击【提交】按钮以后是浏览器将用户填写的文本框等控件中的值“提取”出来发送给服务器,而不是服务器来读取用户填写的这个页面。哪些标签的哪些值会被提交给服务器呢?将用户填写的内容提交到服务器有如下几个条件:
- 只能为 input、textarea、select三种类型的标签。只有input(文本框、CheckBox等)用户才可能填写值,
<label>、<p>、<font>
等标签仅供显示用,没有提交到服务器的必要。 - 只有value属性的值才会提交给服务器。以input标签为例,input标签有title、type、disabled等属性,但是这些属性都是供显示用的,用户并不能修改,只有value属性才是用户输入的属性,因此只有value属性的值才会被提交到服务器。
- 标签必须设定name属性。学习Dom的时候我们知道如果要通过JavaScript操作标签,必须为标签设定Id。如果要将标签的value属性值提交到服务器,则必须为标签设定name属性,提交到服务器的时候将会以“name=value”的键值对的方式提交给服务器,多个键值对之间用&分割。除了单选按钮等少数标签之外,大部分标签的name的值不能重复。name是给服务器用的,id是给Dom用的。对于RadioButton,同name的为一组,选中的RadioButton的value被提交到服务器。
- 如果设置了控件的disabled属性的话,浏览器也不会提交该控件的值。这是与readonly的区别
- 放到form标签内。只有放到form标签内的标签才可能会被提交到服务器,form之外的input等标签被忽略。
2.9.3 服务器如何向浏览器输出数据
context.Response.Write(“我是从服务器输出到浏览器的数据!:)”);
2.10 Request(HttpRequest)常用成员
2.10.1Request其它成员
- Request.UrlReferrer 请求的来源,可以根据这个判断从百度搜的哪个关键词、防下载盗链、防图片盗链,可以伪造(比如迅雷)。"英莱特独有",在进行测试。全局防盗链用Globals.asax
- Request.UserHostAddress获得访问者的IP地址
- Request.Cookies 获取浏览器发过来的浏览器端的Cookie,从它里面读取Cookie值,比如context.Request.Cookies["mysessionid"],使用Request.Cookies 的时候只是读取,将Cookie写回浏览器要用Response.Cookies
- Request.MapPath(virtulPath)将虚拟路径转换为磁盘上的物理路径,Request.MapPath("~/a/b.aspx")就会得到D:\2008\WebSites\WebSite4\a\b.aspx
2.11 Response(HttpResponse)常用成员
2.11.1Response其它成员
响应的缓冲输出:为了提高服务器的性能,ASP.Net向浏览器Write的时候默认并不会每Write一次都会立即输出到浏览器,而是会缓存数据,到合适的时机或者响应结束才会将缓冲区中的数据一起发送到浏览器。
- Response.Buffer、Response.BufferOutput:经过Reflector反编译,发现两个属性是一样的,Buffer内部就是调用的BufferOutput。这个属性用来控制是否采用响应缓存,默认是true。
- Response.Flush()将缓冲区中的数据发送给浏览器。这在需要将Write出来的内容立即输出到浏览器的场合非常适用。案例:大批量数据的导入,显示正在导入第*条数据,用Thread.Sleep模拟耗时。
- Response.Clear()清空缓存区中的数据,这样在缓存区中的没有发送到浏览器端的数据被清空,不会被发送到浏览器。
- Response.ContentEncoding输出流的编码。
- Response.ContentType 输出流的内容类型,比如是html(text/html)还是普通文本(text/plain)还是JPEG图片(image/JPEG)。
- Response.Cookies 返回给浏览器的Cookie的集合,可以通过它设置Cookie
- Response.OutputStream 输出流,在输出图片、Excel文件等非文本内容的时候要使用它
- Response.End() 终止响应,将之前缓存中的数据发给浏览器,End()之后的代码不会被继续执行,End方法里调用了Flush()方法。在终止一些非法请求的时候,比如盗链等可以用End()立即终止请求。
- Response.Redirect(url) 重定向浏览器到新的网址。即可以重定向到站外网址也可以重定向到站内网址。Response.Redirect("http://www.yltedu.com")、Response.Redirect("a.htm")。Redirect是向浏览器发回302重定向(还有一个Location告诉浏览器要重定向到哪个页面),是通知浏览器“请重新访问url这个网址”,这个过程经历了服务器通知浏览器“请重新访问url这个网址”和浏览器接到命令访问新网址的过程。使用HttpWatch查看整个响应过程的Http报文。用Redirect因为是浏览器自己去重新访问新网址的,所以在地址栏中是可以看到网址的变化的。后面会用来防止刷新浏览器时提示“重试”。
- Response.SetCookie(HttpCookie cookie),向输出流中更新写到浏览器中的Cookie,如果Cookie存在就更新不存在就增加。是对Response.Cookies的简化调用。
- Response.Write()向浏览器输出内容。
3.ASP.NET WebForm和状态的保持
3.1 Ashx和Aspx
模板引擎 凡是向服务器请求非HTML资源的功能,都应该交给一般处理程序来处理(ashx);如果客户想看到html页面,这时候我们就应该使用aspx会方便很多。
- 如果每次输出网页都 一般处理程序(ashx) 的话太痛苦了,所以一般生成html的时候都直接创建aspx(Web窗体,WebForm)
- WebForm分为两个文件aspx和aspx.cs,aspx是页面模板,是页面描述文件,就是html+js+css的内容,和aspx.cs结合的更好,不用像一般处理程序那样程序员自己去输出HTML字符串或读取填充模板,控件都是定义在aspx中,内联的JavaScript、CSS也是写在aspx中的,服务端的C#代码是定义在aspx.cs中。aspx控制页面长相,cs控制程序逻辑,这种“前aspx后cs”的方式就被称为CodeBehind(代码后置-为什么要后置?)。
3.2 Server 属性
Server属性是HttpServerUtility的一个实例,它提供对服务器上的方法和属性的访问。
- Server是上下文对象context的一个属性,是HttpServerUtility类的一个对象
- Server.HtmlDecode()、Server.HtmlEncode() Server.UrlEncode()、 Server.UrlDecode()是对HttpUtility类中相应方法的一个代理调用。推荐总是使用HttpUtility,因为有的地方很难拿到Server对象,而且Server的存在是为以前ASP程序员习惯而留的。别把HtmlEncode、UrlEncode混了,UrlEncode是处理超链接中的中文问题, HtmlEncode是处理html代码的。还是推荐用HttpUtility.HtmlEncode。
- Server.Transfer(path) 内部重定向请求,Server.Transfer(“JieBanRen.aspx”)将用户的请求重定向给JieBanRen.aspx处理,是服务器内部的接管(不能重定向到外部网站).因为是内部接管,所以在被重定向到的页面中是可以访问到Request、Cookies等这些来源页面接受的参数的,就像这些参数是传递给他的,而Redirect则不行,因为是让浏览器去访问的。注意Transfer是内部接管,因此不能像Redirect那样重定向到外部网站。 (常考)Response.Redirect就可以重定向到外部网站。
- 不能内部重定向到ashx,否则会报错“执行子请求出错”.
- 有的时候不能拿到HttpContext对象,比如在Global.asax中(后面讲),可以通过HttpContext.Current拿到当前的HttpContext,进而拿到Response/Request/Server等
- Server.MapPath。
3.3 无状态Http
- 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。
- 应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议。
- 一个浏览者发出的请求都是由实现了IHttpHandler接口的对象进行响应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了,写的类变量值早就不存在了,因此不要将状态信息保存到类变量中。
- Http协议是无状态的,不会记得上次和网页“发生了什么”。服务器不记得上次给了浏览器什么。
- 对网站造成的影响:如果用户录入了一些信息,当跳转到下一个页面时,数据丢失,再也不能获得那些数据。
- 如果要知道上一次的状态信息,我们就得把这个状态信息记录在某个地方:
- a.服务器端
- b.浏览器端
- c. 表单元素中—如:隐藏域
<input type=“hidden”/>
(Http报文)
3.4 ASP.NET中的状态(信息)保持方案
3.10 常用的状态(信息)保持方式(重点)
3.10.1 ViewState:
- ASP.NET 的 .aspx页面特有,页面级的;
- 就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式;
- 服务器端控件的值都自动保存在ViewState中;
服务器将ViewState里保存的值经过Base64编码后,自动添加到页面的隐藏域中。 使用ViewState可以方便的在服务器端将数据输出保存到客户端页面的一个隐藏域中
Aspx里的ViewState初探
- 查看生成的源代码,ASP.Net将所有隐藏内容统一放到了名字为__VIEWSTATE的隐藏字段中,使用序列化算法将所有隐藏内容放到一个字符串中。点击几次在使用ViewStateDecoder这个工具查看ViewState内容,发现了确实将这些改变的内容放到了ViewState中。存储非表单域、非value值的容器。
- 禁用ViewState的方法,禁用单个控件的ViewState设定enableviewstate=false,禁用ViewState以后TextBox版本不受影响。禁用整个页面的,在aspx的Page指令区加上EnableViewState="false" 。内网系统、互联网的后台可以尽情的用ViewState。
- 回答ViewState原理的时候:说Input版本(TextBox)自增和Div版本(Label)的不同。(完美!!!)-- 当某些控件的某些属性不属于浏览器表单的提交范围时,fw将会把这些属性添加到ViewState中保存。
参考https://www.cnblogs.com/tangge/archive/2013/04/11/3015474.html
- WebForm的IsPostBack依赖于ViewState
3.10.2 Cookie:
- HTTP协议下的一种方式,通过该方式,服务器或脚本能够在客户机上维护状态信息;
- 就是在客户端保存客户端单独使用的数据的一种方式;
- 就像你的病历本一样,医院直接给你带回家;
Cookie(小甜饼)—病历本
- Cookie是一种能够让网站服务器把少量数据(4kb左右)储存到客户端的硬盘或内存,并且读取出来的一种技术。
- 当你浏览某网站时,由Web服务器放置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、浏览过的网页或者停留的时间等网站想要你保存的信息。当你再次通过浏览器访问该网站时,浏览器会自动将属于该网站的Cookie发送到服务器去,服务器通过读取Cookie,得知你的相关信息,就可以做出相应的动作。如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。
- 浏览器访问一个站点时,只将属于当前站点的Cookie发过到服务器。(根据域名)—(没必要把每家医院的病历本都带过去。)
- Cookie不兼容浏览器!
- 浏览器保存Cookie有两种方式:
- 浏览器的内存中;关闭浏览器后,会自动清空
- 浏览器所在的电脑的硬盘中。为将要写入到浏览器的Cookie对象设置失效时间:cook.Expires = DateTime.Now.AddMinutes(5);//设置cook5分钟后失效
- 开发场景:常用于登录和保存用户最近浏览商品
- 从浏览器发来的Cookie的Expires属性值是无效的.(浏览器在向服务器发送Cookie的时候,没有将Cookie的失效时间发送过去)
写入Cookies的两种方式
下面的代码示例演示一个名为 UserSettings 的 Cookie,并设置其 Font 和 Color 子项的值。过期时间设置为明天。
Response.Cookies["UserSettings"]["Font"] = "Arial";
Response.Cookies["UserSettings"]["Color"] = "Blue";
Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(1d);
-
创建 HttpCookie 类型的对象并为它分配名称。
-
为 Cookie 的子项赋值并设置所有 Cookie 属性。
-
将该 Cookie 添加到 Cookies 集合中。
下面的代码示例演示一个名为 myCookie 的 HttpCookie 对象的实例,该实例表示一个名为 UserSettings 的 Cookie。
HttpCookie myCookie = new HttpCookie("UserSettings");
myCookie["Font"] = "Arial";
myCookie["Color"] = "Blue";
myCookie.Expires = DateTime.Now.AddDays(1d);
Response.Cookies.Add(myCookie);
读取 Cookie
-
使用 Cookie 名作为键从 Cookies 集合中读取字符串。
下面的示例读取名为 UserSettings 的 Cookie,然后读取名为 Font 的子键的值
if (Request.Cookies["UserSettings"] != null)
{
string userSettings;
if (Request.Cookies["UserSettings"]["Font"] != null)
{ userSettings = Request.Cookies["UserSettings"]["Font"]; }
}
删除 Cookie
不能直接删除用户计算机中的 Cookie。但是,可以通过将 Cookie 的到期日期设置为过去的日期,让用户的浏览器来删除 Cookie。当用户下一次向设置该 Cookie 的域或路径内的页发出请求时,浏览器将确定该 Cookie 已到期并将其移除
-
确定 Cookie 是否存在,如果存在则创建同名的新 Cookie。
-
将 Cookie 的到期日期设置为过去的某一时间。
-
将 Cookie 添加到 Cookies 集合对象。
下面的代码示例演示如何为 Cookie 设置已过去的到期日期
if (Request.Cookies["UserSettings"] != null)
{
HttpCookie myCookie = new HttpCookie("UserSettings");
myCookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(myCookie);
}
写入,读取,修改和删除 整体操作案例
//写入Cookie2种方式
//方式1
var cookie = new HttpCookie("name", "joye888");
Response.Cookies.Add(cookie);
//方式2
Response.Cookies["name1"].Value = "joye8881";
Response.Cookies["name1"].Expires = DateTime.MaxValue;
//写入多值Cookie
//方式1:
//Response.Cookies["userinfo"]["name"].Value = "joye888";
//Response.Cookies["userinfo"].Expires = DateTime.MaxValue;
//方式2:
HttpCookie cookie2 = new HttpCookie("userinfo");
cookie2.Values["name"] = "joye888";
cookie2.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(cookie2);
//读取Cookie的值之前,应该确保该 Cookie 确实存在。否则,您将得到一个异常
//读取Cookie
var httpCookie = Request.Cookies["name1"];
if (httpCookie != null)
{
var name = httpCookie.Value;
}
//多值Cookie的读取
var httpCookie1 = Request.Cookies["userInfo"];
if (httpCookie1 != null)
{
var name1 = httpCookie1["name"];
}
//修改和删除cookie
//修改的方法与创建方法相同
var cookieEdit = new HttpCookie("name", "joye888Edit");
cookieEdit.Expires = DateTime.Now.AddDays(-1); //将其有效期设置为过去的某个日期。当浏览器检查 Cookie 的有效期时,就会删除这个已过期的 Cookie。
Response.Cookies.Add(cookieEdit);
//如果有主站及二级域名站且cookie要共享的话则要加入如下设置
cookie.Domain = ".cnblog.com";
cookie.Path = "/";
Cookie的实际运用
登录记住用户名和密码示例
页面代码:
<body>
<form id="form1" method="post" action="rembPage.aspx">
<div>
帐号: <input type="text" name="userName" /><br />
密码 :<input type="password" name="pass" /><br />
记住我: <input type="checkbox" value="rem" name="sele1" /><br />
<input type="submit" value=" 登录 " />
</div>
</form>
</body>
if (Request.Cookies["userName"] == null && Request.Cookies["passWord"] == null) //判断是否存在cookie,如果存在表示上次选择了记住我
{
if (Request.Form["userName"] != null && Request.Form["pass"] != null)
{
String userName = Request.Form["userName"];
String userPassWord = Request.Form["pass"];
if (userName == "admin" && userPassWord == "123")
{
if (Request.Form["sele1"] != null)
{
HttpCookie cookieUserName = new HttpCookie("userName", userName); //创建帐号的cookie实例
HttpCookie cookiePassWord = new HttpCookie("passWord", userPassWord);
cookieUserName.Expires = DateTime.Now.AddDays(2); //设置帐号cookie的过期时间,当前时间算往后推两天
cookiePassWord.Expires = new DateTime(2012, 5, 27); //设置密码cookie的过期时间,过期时间为2012年5月27日
Response.Cookies.Add(cookieUserName); //将创建的cookieUserName文件输入到浏览器端
Response.Cookies.Add(cookiePassWord);
Response.Redirect("Index.aspx"); //跳转到你想要的页面
}
else
{
Response.Redirect("Index.aspx");//即便不记住密码也要跳转
}
}
}
}
else
{
Response.Redirect("Index.aspx");//如果记住密码,第二次登录将直接进入Index.aspx页面
}
3.10.3 Session:
- 在服务器端保存客户端单独使用的数据的一种方式;
- 就像银行账户,钱都存在银行里,你就拿一张银行卡(SessionId)回家;
当会话过期或终止时,服务器就会清除 Session 对象
- Session提供了一种把信息保存在服务器内存中的一种方式。它能存储任何数据类型包括自定义对象。
- 每个客户端的Session是独立存储。
- Session 对象用于存储有关用户的信息。
- 在整个用户会话过程中都会保留此信息。(保存SessionId的cookie丢失之前)
- 当用户在应用程序中从一个网页浏览到另一个网页时,存储在 Session 对象中的变量不会被丢弃。
- Session只可由该会话的用户访问(因为SessionId的东东以cookie的方式保存访问者浏览器的缓存里了)
- 用户不能访问或修改他人的Session
Session的操作
- 开始并为Session赋值:Session[“uName”]=“CNYaoMing”;
- 取值:string strName = Session[“uName”].ToString();
- 销毁(取消/退出):Session.Abandon();//销毁服务器端的Session对象Session.Clear();//清空服务端的Session对象里的键值对,Session对象并没有从Session池里销毁
Session常用属性、方法
- SessionID:唯一用户会话标识符
- TimeOut:用户超时(单位:分钟),默认20分钟
- Count:会话状态集合中的项目数
- Abandon方法:用于显式结束会话
3.10.4 Application:
Application对象用来存储和维护某些值,需要通过定义变量来完成,该对象定义的变量为应用程序级变量,即全局变量
语法如下:Application[变量名]=值
protected void Page_Load(object sender, EventArgs e)
{
//Application.Lock和Application.UnLock一般配对出现,用于锁住Lock与UnLock之间的所有代码,代码段内的代码不会被多线程同时执行
Application.Lock();
Application["name"] = "小明";
Application.UnLock();
Response.Write("Application[\"name\"]的值为:"+Application["name"].ToString());
}
//写入
Session["UserName"] = "joye888";
//读取
var userName = Session["UserName"].ToString();
Response.Write(userName);
//遍历
IEnumerator sessionEnum = Session.Keys.GetEnumerator();
while (sessionEnum.MoveNext())
{
Response.Write(Session[sessionEnum.Current.ToString()].ToString() + " ");
}
//销毁
Session.Abandon(); //结束会话
Session.Clear();//不结束会话
- 在服务器端保存共享数据的一种方式;
- 就像银行的单人公共卫生间,谁进去都行,但一次去一个,进去了就锁上门,出来再把锁打开;
Application对象可以存储应用程序级的数据。
- “Application”:应用程序
- 第一个用户访问站点时,应用程序启动,并创建一个Application对象。
- 创建成功后,整个应用程序中都可以使用该对象。
- 除非应用程序关闭,否则对象一直存储在内存中。