本章要点: 掌握HttpRequest对象的应用。 掌握HttpResponse对象的应用。 掌握HttpServerUtility对象的应用,理解不 同方法的页面重定向。 掌握跨页面提交的应用。了解ViewState、 HiddenField,掌握Cookie、Session、 Application、Profile的应用。
目录 6.1 HTTP请求 6.2 HTTP响应 6.3 HttpServerUtility 6.4 跨页面提交 6.5 状态管理 6.1 HTTP请求 6.2 HTTP响应 6.3 HttpServerUtility 6.4 跨页面提交 6.5 状态管理 6.5.1 ViewState 6.5.2 HiddenField控件 6.5.3 Cookie 6.5.4 Session 6.5.5 Application 6.5.6 Profile 6.6 小结
6.1 HTTP请求 ASP.NET 4.5通过Page类的Request属性能很好地控制 请求数据,如访问客户端的浏览器信息、查询字符 串、Cookie等信息。 实际上,Page类的Request属性值是一个HttpRequest 对象,它封装了HTTP请求信息。
HttpRequest对象的数据集合对应表 说明 QueryString 从查询字符串中读取用户提交的数据 Cookies 获得客户端的Cookie数据 ServerVariables 获得服务器端或客户端的环境变量信息 Browser 获得客户端浏览器信息
6.1 HTTP请求(续) 在使用HttpRequest对象时,常通过Page类的 Request属性调用,所以要获取HttpRequest对 象的Browser数据集合的语法格式常写为: Request.Browser。 利用QueryString数据集合获得的查询字符串是 指跟在URL后面的变量及值,它们以“?”与URL 间隔,不同的变量之间以“&”间隔。
实例6-1 利用QueryString在页面间传递数据信息 在本实例中,当单击QueryString1.aspx页面上 链接后,页面被重定向到QueryString2.aspx; 在页面QueryString2.aspx中显示从 QueryString1.aspx传递过来的查询字符串数据 信息。 源程序:QueryString1.aspx 源程序:QueryString2.aspx
6.1 HTTP请求(续) 利用ServerVariables数据集合可以很方便地获 取服务器端或客户端的环境变量信息,如客户 端的IP地址等。 语法格式为:Request.ServerVariables["环境 变量名"]。
常用的环境变量表 环境变量名 说明 LOCAL_ADDR 服务器端的IP地址 PATH_TRANSLATED 当前页面在服务器端的物理路径 REMOTE_ADDR 客户端IP地址 REMOTE_HOST 客户端计算机名 SERVER_NAME 服务器端计算机名 SERVER_PORT 服务器端网站的端口号
6.1 HTTP请求(续) Browser数据集合用于返回用户的浏览器类型、 版本等信息,以便根据不同的浏览器编写不同 的页面。 6.1 HTTP请求(续) Browser数据集合用于返回用户的浏览器类型、 版本等信息,以便根据不同的浏览器编写不同 的页面。 语法格式为:Request.Browser["浏览器特性名 "]。
浏览器特性名对应表 名称 说明 Browser 浏览器类型 Version 浏览器版本号 MajorVersion 浏览器主版本号 MinorVersion 浏览器次版本号 Cookies 逻辑值,true表示支持Cookie JavaScript 逻辑值,true表示支持JavaScript ActiveXControls 逻辑值,true表示支持ActiveX控件
实例6-2 利用ServerVariables和Browser返回服务器端和客户端信息 源程序:Request.aspx 注意:本实例是在VSEW 2012中浏览 Request.aspx后的效果图,因此,服务器端和 客户端的IP地址都为本机地址。其中,“::1” 表示IPv6格式的本机地址。一旦将网站发布到 安装IIS 7.5的Web服务器后,再从其他的客户 端访问页面将看到不同的地址。
6.2 HTTP响应 ASP.NET 4.5通过Page类的Response属性可以很 好地控制输出的内容和方式,如页面重定向、 保存Cookie等。 实际上,Response属性值是一个HttpResponse 对象。
HttpResponse对象的常用属性和方法表 成员 说明 Cookies属性 添加或修改客户端的Cookie AppendToLog()方法 将自定义日志信息添加到IIS日志文件中 End()方法 终止页面的执行 Redirect()方法 页面重定向,可通过URL附加查询字符串实现不同页面之间的数据传递 Write()方法 在页面上输出信息
实例6-3 利用Write()方法输出XHTML文本 利用Write()方法除可以输出提示信息、变量值 外,还可以输出XHTML文本或JavaScript脚本等。 源程序:Write.aspx
程序说明 for循环执行完后向浏览器输出的XHTML文本如 下: <p style="font-size:10px">我喜欢 ASP.NET!</p> <p style="font-size:14px">我喜欢 ASP.NET!</p> <p style="font-size:18px">我喜欢 ASP.NET!</p> 其中,“"”的输出需要转义符\,即在源程序中 必须写成“\"”。
实例6-4 利用Redirect()方法重定向页面 在本实例中,选择“教师”后单击“确定”按 钮,页面将被重定向到教师页面Teacher.aspx。 源程序:Redirect.aspx 源程序:Teacher.aspx
6.3 HttpServerUtility 在ASP.NET 4.5中,Page类的Server属性封装了 服务器端的一些操作,如将XHTML元素标记转换 为字符实体、获取页面的物理路径等。 实际上,Server属性值是一个 HttpServerUtility对象。
HttpServerUtility对象的常用属性和方法 ScriptTimeOut属性:设置页面执行的最长时间, 单位为秒。 Execute()方法:停止执行当前页面,转到并且 执行新页面,执行完毕后返回原页面,继续执 行后续语句。 HtmlEncode()方法:将字符串中的XHTML元素标 记转换为字符实体,如将“<”转换为<。 MapPath()方法:获取页面的物理路径。
HttpServerUtility对象的常用属性和方法(续) Transfer()方法:停止执行当前页面,转到并 且执行新页面,执行完毕后不再返回原页面。 UrlEncode()方法:将字符串中某些特殊字符转 换为URL编码,如将“/”转换为“%2f”,空格 转换为“+”。
Response.Redirect()、Server.Execute()和Server.Transfer()的区别 Redirect()方法尽管在服务器端执行,但重定 向实际发生在客户端,可从浏览器地址栏中看 到地址变化;而Execute()和Transfer()方法的 重定向实际发生在服务器端,在浏览器的地址 栏中看不到地址变化。 Redirect()和Transfer()方法执行完新页面后, 并不返回原页面;而Execute()方法执行完新页 面后会返回原页面继续执行。
Response.Redirect()、Server.Execute()和Server.Transfer()的区别(续) Redirect()方法可重定向到同一网站的不同页 面,也可重定向到其它网站的页面;而 Execute()和Transfer()方法只能重定向到同一 网站的不同页面。 利用Redirect()方法在不同页面之间传递数据 时,状态管理采用查询字符串形式;而 Execute()和Transfer()方法的状态管理方式与 Button类型控件的跨页面提交方式相同。
实例6-5 运用HttpServerUtility对象 实例6-5 运用HttpServerUtility对象 Server.HtmlEncode()方法常用于在页面上输出 XHTML元素。 Server.UrlEncode()常用于处理URL地址,如地 址中包含空格等。 在本实例中,单击Student.aspx链接时将丢失 “张”后面的信息。单击 Student.aspx(UrlEncode)链接时,因使用了 Server.UrlEncode()方法不再丢失“张”后面 的信息。 源程序:Server.aspx
6.4 跨页面提交 利用Button类型控件实现跨页面提交是另一种实现 页面重定向的方法。 6.4 跨页面提交 利用Button类型控件实现跨页面提交是另一种实现 页面重定向的方法。 需要将源页面上Button类型控件的PostBackUrl属 性值设置为目标页面路径。而在目标页面上,需要 在页面头部添加@ PreviousPageType指令,并设置 VirtualPath属性值为源页面路径。 在目标页面上访问源页面中数据的方法有两种:一 是利用PreviousPage.FindControl()方法访问源页 面上的控件;二是先在源页面上定义公共属性,再 在目标页面上利用“PreviousPage.属性名”获取 源页面中数据。
跨页面提交与调用Server.Execute()或Server.Transfer()方法的区别 如果是跨页面提交,那么IsCrossPagePostBack 属性值为true;如果是调用Server.Execute() 或Server.Tranfer()方法,那么 IsCrossPagePostBack属性值为false。
实例6-6 运用跨页面提交技术 在Cross1.aspx中输入用户名、密码后单击“确 定”按钮,将通过跨页面提交技术重定向到 Cross2.aspx,并且显示在Cross1.aspx中输入 的数据信息。 源程序:Cross1.aspx 源程序:Cross2.aspx
6.5 状态管理 客户端状态管理:将状态数据保存在客户端计算机 上,当客户端向服务器端发送请求时,状态数据会 随之发送到服务器端。可选择ViewState、 ControlState、HiddenField、Cookie和查询字符 串。 服务器状态管理:将状态数据保存在服务器上。可 选择Session状态、Application状态或数据库形式。 客户端状态不消耗服务器内存资源,但容易泄露数 据信息。而服务器端状态将消耗服务器端内存资源, 但具有较高的安全性。
6.5.1 ViewState 又称为视图状态,用于维护Web窗体自身的状态。 当用户请求ASP.NET 4.5页面时,ASP.NET 4.5 将ViewState封装为一个或几个隐藏的表单域传 递到客户端。当用户再次提交页面时, ViewState也将被提交到服务器端。这样后续的 请求就可以获得上一次请求时的状态。 可在客户端浏览ASP.NET 4.5页面时,选择“查 看”→“源文件”命令进行查看。 EnableViewState属性:值为False可实现禁用 ViewState的目的。
6.5.2 HiddenField控件 又称隐藏域,用于维护Web窗体自身的状态。 不会显示在用户的浏览器中,但可以像设置标 准控件的属性那样设置其属性。 成员主要有Value属性和ValueChanged事件。 注意:要触发ValueChanged事件,需设置 HiddenField控件的EnableViewState属性值为 False。
6.5.3 Cookie 保存在客户端硬盘或内存中的一小段文本信息, 如网站、用户、会话等有关的信息。 与网站关联,而不是与特定的页面关联。 可以在客户端修改Cookie设置和禁用Cookie。 当用户的浏览器关闭了对Cookie的支持,但又 要使用Cookie时,只需在Web.config文件的 <system.web>元素中加入以下语句: <sessionState cookieless="AutoDetect">或 <sessionState cookieless="UseUri">
6.5.3 Cookie(续) 在Windows 7操作系统中,Cookie文本文件存储 于 “%userprofile%\AppData\Roaming\Microsoft \ Windows\Cookies”文件夹。 提供System.Web.HttpCookie类来处理Cookie, 常用的属性是Value和Expires。
建立Cookie 方法一: Response.Cookies["Name"].Value="张三"; 方法二: HttpCookie cookie = new HttpCookie("Name"); cookie.Value = "张三"; cookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(cookie);
获取Cookie Request.Cookies.["Name"].Value
实例6-7 利用Cookie限制页面访问 在本实例中,用户访问Cookie.aspx时,若在 Cookie中已有用户信息则显示欢迎信息,否则 被重定向到CookieLogin.aspx。这意味着当 Cookie中未包含用户信息时,就不能访问 Cookie.aspx,实现了限制页面访问的目的。 源程序:Cookie.aspx 源程序:CookieLogin.aspx
程序说明 测试时先浏览Cookie.aspx,此时因无用户名 Cookie信息,页面被重定向到 CookieLogin.aspx,输入用户名和密码后单击 “确定”按钮将用户名存入Cookie。关闭浏览 器。再次浏览Cookie.aspx可看到欢迎信息。
6.5.4 Session 又称会话状态,常用于存储用户信息、多页面 间的信息传递、购物车等。 产生在服务器端,只能为当前访问的用户服务。 以用户对网站的最后一次访问开始计时,当计 时达到会话设定时间并且期间没有访问操作时, 则会话自动结束。 如果同一个用户在浏览期间关闭浏览器后再访 问同一个页面,服务器会为该用户产生新的 Session。
6.5.4 Session(续) 用一个唯一的Session ID来标识每一个会话。 若客户端支持Cookie,则将Session ID保存到 相应的Cookie中;若不支持,就将Session ID 添加到URL中。 注意:不管Session ID保存在Cookie还是添加 在URL中,都是明文。如果需要保护Session ID, 可考虑采用HTTPS通信。 Session由System.Web.HttpSessionState类实 现。
HttpSessionState常用的属性和方法表 说明 Contents属性 获取对当前会话状态对象的引用 Mode属性 获取当前会话状态的模式 SessionID属性 获取会话的唯一标识 TimeOut属性 获取或设置会话状态持续时间,单位为分钟,默认为20分钟 Abandon()方法 取消当前会话 Remove()方法 删除会话状态集合中的项
Session_Start()和Session_End()方法 包含于Global.asax文件中。 Session_Start()方法中代码在新会话启动时会 自动被执行。 Session_End()方法中代码在会话结束时会自动 被执行。 注意: 只有Web.config 文件中的 sessionState 模式设置为InProc时,才会执行 Session_End()方法代码。如果会话模式设置为 StateServer或SQLServer,则不会执行 Session_End()方法代码。
Session的赋值 方法一: Session["Name"]="张三"; 方法二: Session.Contents["Name"]="张三"; 注意:Session使用的名称不区分大小写,因此 不要用大小写区分不同的Session变量。
Session的存储方式 在Web.config中通过<sessionState>元素的 mode属性来指定。 共有Off、InProc、StateServer、SQLServer和 Custom五个枚举值供选择,分别代表禁用、进 程内、独立的状态服务、SQLServer和自定义数 据存储。 在实际工程项目中,一般选择StateServer,而 对于大型网站常选用SQLServer。
实例6-8 利用Session限制页面访问 本实例功能类似于实例6-7,但适用于客户端已 禁用Cookie的情况。 利用本实例能限制对Session.aspx的访问,即 首先要通过登录认证才能访问该页面。 源程序:Session.aspx 源程序:SessionLogin.aspx
程序说明 当用户直接访问Session.aspx时,会判断 Session["Name"]状态值,若为空,则被重定向 到SessionLogin.aspx,否则显示欢迎信息。 在SessionLogin.aspx中用户登录成功后,将建 立Session["Name"]状态值。此时要测试是否存 在Session["Name"]状态值,应在浏览 SessionLogin.aspx页面的浏览器中直接更改地 址来访问Session.aspx。
6.5.5 Application 又称应用程序状态,应用于所有的用户。 由System.Web.HttpApplicationState类来实现。 要修改Application状态值时,首先要调用 Application.Lock()方法锁定Application状态, 值修改后再调用Application.Unlock()方法解 除锁定。 Application_Start()、Application_End()、 Application_Error()方法包含于Global类。
实例6-9 统计网站在线人数 本实例呈现网站在线人数。 实例6-9 统计网站在线人数 本实例呈现网站在线人数。 考虑三个方面:初始化计数器;当一个用户访 问网站时,计数器增1;当一个用户离开网站时, 计数器减1。 源程序:Global.asax 源程序:Application.aspx
程序说明 可同时利用多个浏览器或多台计算机访问 Application.aspx,进行测试。当然,若通过 多台计算机进行测试,需要先将网站复制到IIS 7.5。 注意:Session_End()方法代码只有到达 TimeOut属性设置的时间时才被执行,所以关闭 浏览器不会立即调用该方法。
6.5.6 Profile 用户个性化配置功能可以很方便地为每个用户 定义、存储和管理配置信息。 会自动识别不同的匿名用户。 默认情况下,配置信息以ASPNETDB.mdf数据库 名存储于网站的App_Data文件夹。 使用“%windir%\Microsoft.NET\Framework\ v4.0.30319”文件夹中的aspnet_regsql.exe命 令行工具可将配置信息保存到其他版本的SQL Server中。
用户个性化配置过程 第一,在Web.config文件中的<profile>元素中 定义配置信息名、数据类型、是否允许匿名用 户存储信息等。 第二,在程序中利用Profile对象访问用户个性 化信息。
实例6-10 利用Profile存取匿名用户的邮政编码信息 在本实例中,当某匿名用户输入邮编,单击 “写入”按钮把邮编保存到ASPNETDB.mdf数据 库的aspnet_Profile表中。单击“显示”按钮 从aspnet_Profile表中获取该匿名用户的邮编 并显示在页面上。 源程序: Web.config 源程序:Profile.aspx
程序说明 由于在Web.config文件中添加了用户个性化配 置信息,所以浏览Profile.aspx时ASP.NET 4.5 会在网站的App_Data文件夹中自动建立默认的 ASPNETDB.mdf数据库。另外,不需要访问数据 库的语句,直接通过Profile对象即可保存或获 取存储于aspnet_Profile表中的用户个性化信 息。 注意:将包含Profile.aspx的网站发布到IIS 7.5后,由于从不同的计算机访问Profile.aspx 将生成不同的匿名用户标识,故不能共享存储 的邮编。
6.6 小结 HttpRequest提供了QueryString、 ServerVariables、Browser、Cookies等数据集合 来访问不同用途的数据。 HttpResponse提供了输出XHTML文本、JavaScript 脚本、Cookie等功能。 为了有效防范SQL脚本注入,常会使用 HttpServerUtility对象的HtmlEncode()方法,该 对象同时提供了UrlEncode()、MapPath()等实用方 法。 页面重定向可采用<a>元素、HyperLink、 Response.Redirect()、Server.Execute()、 Server.Transfer()和Button类型控件的跨页面提 交等形式,在使用时要注意它们的区别。
6.6 小结(续) 状态管理分为客户端和服务器端两种管理形式。 客户端形式使用较多的是Cookie和查询字符串, 服务器端形式包含Session、Application和数 据库等。其中,Session对应单个用户,而 Application对应所有用户。 若要实现个性化网站,需要配置Web.config和 使用Profile对象。