重新整理视频教程下载地址

http://iask.sina.com.cn/h/user.php?uid=1135438781

posted @ 2008-05-27 08:32 水源 阅读(462) | 评论 (0)编辑
 

自己的学习过程涉及的知识

内容来源于网络

ASP.NET 中 Cookie 的基本知识


Mike Pope
Visual Basic User Education
Microsoft Corporation
2003年1月

摘要:本文介绍如何使用 Visual Basic 在 ASP.NET Web 应用程序中读写 HTTP Cookie。

适用于:

  • ASP.NET
  • Microsoft® Visual Studio® .NET
  • Web 窗体

读者范围:初级 Web 程序员

目录

简介

Cookie 为 Web 应用程序保存用户相关信息提供了一种有用的方法。例如,当用户访问您的站点时,您可以利用 Cookie 保存用户首选项或其他信息,这样,当用户下次再访问您的站点时,应用程序就可以检索以前保存的信息。

本文概要介绍 Cookie 在 ASP.NET 应用程序中的应用,为您展示在 ASP.NET 中应用 Cookie 的技术细节,例如编写 Cookie、然后再读取它们。同时,还将为您介绍 Cookie 的各种特性和各种特殊情况,以及 ASP.NET 对 Cookie 的支持。

什么是 Cookie?

Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。用户每次访问站点时,Web 应用程序都可以读取 Cookie 包含的信息。

假设在用户请求访问您的网站 www.contoso.com 上的某个页面时,您的应用程序发送给该用户的不仅仅是一个页面,还有一个包含日期和时间的 Cookie。用户的浏览器在获得页面的同时还得到了这个 Cookie,并且将它保存在用户硬盘上的某个文件夹中。

以后,如果该用户再次访问您站点上的页面,当该用户输入 URL www.contoso.com 时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie。如果该 Cookie 存在,浏览器就将它与页面请求一起发送到您的站点,您的应用程序就能确定该用户上一次访问站点的日期和时间。您可以根据这些信息向用户发送一条消息,也可以检查过期时间或执行其他有用的功能。

Cookie 是与 Web 站点而不是与具体页面关联的,所以无论用户请求浏览站点中的哪个页面,浏览器和服务器都将交换 www.contoso.com 的 Cookie 信息。用户访问其他站点时,每个站点都可能会向用户浏览器发送一个 Cookie,而浏览器会将所有这些 Cookie 分别保存。

以上就是 Cookie 的基本工作原理。那么,Cookie 有哪些用途呢?最根本的用途是 Cookie 能够帮助 Web 站点保存有关访问者的信息。更概括地说,Cookie 是一种保持 Web 应用程序连续性(即执行“状态管理”)的方法。浏览器和 Web 服务器除了在短暂的实际信息交换阶段以外总是断开的,而用户向 Web 服务器发送的每个请求都是单独处理的,与其他所有请求无关。然而在大多数情况下,都有必要让 Web 服务器在您请求某个页面时对您进行识别。例如,购物站点上的 Web 服务器跟踪每个购物者,以便站点能够管理购物车和其他的用户相关信息。因此 Cookie 的作用就类似于名片,它提供了相关的标识信息,可以帮助应用程序确定如何继续执行。

使用 Cookie 能够达到多种目的,所有这些目的都是为了使 Web 站点记住您。例如,一个实施民意测验的站点可以简单地利用 Cookie 作为布尔值,表示您的浏览器是否已经参与了投票,从而避免您重复投票; 而那些要求用户登录的站点则可以通过 Cookie 来确定您是否已经登录过,这样您就不必每次都输入凭据。

有关 Cookie 的更多背景信息,建议您阅读 Verizon Web 站点中的“How Internet Cookies Work”一文,地址为 http://www22.verizon.com/about/community/learningcenter/articles/displayarticle1/0,4065,1022z1,00.html(英文)。其作者详细解释了什么是 Cookie 以及 Cookie 是如何在浏览器和服务器之间交换信息的,他还全面总结了 Cookie 涉及的隐私问题。

顺便问一下,您是否想知道它们为什么被称作“Cookie”?Jargon File(又称为“The New Hacker's Dictionary”)版本 4.3.3 对这一术语的词源给出了准确的定义和合理的解释。您可以在 http://www.catb.org/~esr/jargon/jargon.html#cookie(英文)找到相关的条目。

在此后的内容中,本文将假设您已经知道什么是 Cookie,并且假设您已经清楚为什么要在 ASP.NET 应用程序中使用 Cookie。

Cookie 的限制

在开始讨论 Cookie 的技术细节之前,我想先介绍一下 Cookie 应用的几条限制。大多数浏览器支持最多可达 4096 字节的 Cookie,如果要将为数不多的几个值保存到用户计算机上,这一空间已经足够大,但您不能用一个 Cookie 来保存数据集或其他大量数据。在实际应用中,您可能并不希望在 Cookie 中保存大量的用户信息,而只希望保存用户编号或其他标识符。之后,当用户再次访问您的站点时,您就可以使用该用户 ID 在数据库中查找用户的详细信息。(有关保存用户信息的说明,请参阅 Cookie 和安全性。)

浏览器还限制了您的站点可以在用户计算机上保存的 Cookie 数。大多数浏览器只允许每个站点保存 20 个 Cookie。如果试图保存更多的 Cookie,则最先保存的 Cookie 就会被删除。还有些浏览器会对来自所有站点的 Cookie 总数作出限制,这个限制通常为 300 个。

您最可能遇到的 Cookie 限制是:用户可以设置自己的浏览器,拒绝接受 Cookie。您很难解决这个问题,除非完全不使用 Cookie 而是通过其他机制来保存用户相关信息。保存用户信息的一种常用方法是会话状态,但会话状态又依赖于 Cookie。这一点在后面的 Cookie 和会话状态中阐述。

注意:有关状态管理和 Web 应用程序中用于保存信息的选项的详细信息,请参阅 Introduction to Web Forms State(英文)和 State Management Recommendations(英文)。

更一般的经验很可能是,尽管 Cookie 在应用程序中非常有用,应用程序也不应该依赖于能够保存 Cookie。利用 Cookie 可以做到锦上添花,但不要利用它们来支持关键功能。如果您的应用程序必须使用 Cookie,则您可以通过测试来确定浏览器是否接受 Cookie。我在本文后面的检查浏览器是否接受 Cookie 一节中简单介绍了一种测试方法。

编写 Cookie

您可以利用页面的 Response(英文)属性来编写 Cookie,该属性提供的对象使用户可以将信息添加到由页面向浏览器呈现的信息中。Response 对象支持一个名为 Cookies(英文)的集合,您可以向其中添加要写入浏览器的 Cookie。

注意:下面要讨论的 Response 对象和 Request 对象分别是包含 HttpResponse(英文)和 HttpRequest(英文)类实例的页面的属性。要在文档中查找 ResponseRequest 的信息,请参阅 HttpResponseHttpRequest 下的内容。

在创建 Cookie 时,您需要指定几个值。最初,您要指定 Cookie 的名称和其中保存的值。您可以创建多个 Cookie,每个 Cookie 都必须具有唯一的名称,以便日后读取时识别。(Cookie 是按名称保存的,所以如果您创建了两个名称相同的 Cookie,后保存的那一个将覆盖前一个。)

您可能还希望指定 Cookie 的过期日期和时间。Cookie 一般都写入到用户的磁盘,然后可能一直都留在磁盘上。因此,您可以指定 Cookie 过期的日期和时间。当用户再次访问您的站点时,浏览器会先检查您站点的 Cookie 集合,如果某个 Cookie 已经过期,浏览器不会把这个 Cookie 随页面请求一起发送给服务器,而是删除这个已经过期的 Cookie。(您的站点可能已经在用户计算机上写入了多个 Cookie,每个 Cookie 都有各自的过期日期和时间。) 请注意,由浏览器负责管理硬盘上的 Cookie,这将影响您在应用程序中对 Cookie 的使用,我很快会介绍这方面的内容。

一个 Cookie 的有效期应为多长?这取决于 Cookie 的用途,换句话说,取决于您的应用程序需要 Cookie 值保持有效的时间有多长。如果利用 Cookie 统计网站的访问者,您可以把有效期设置为 1 年,如果某个用户已有一年时间未访问您的站点,则可以把该用户当作新的访问者; 如果利用 Cookie 来保存用户的首选项,则可以把其设置为永远有效(例如 50 年后到期),因为定期重新设置首选项对用户而言是比较麻烦的。有时,您可能需要编写在数秒或数分钟内即过期的 Cookie。在本文后面的检查浏览器是否接受 Cookie 一节中,我列举了一个示例,该示例中创建的 Cookie 的实际有效期就只有几秒。

注意:不要忘记用户随时可以删除自己计算机上的 Cookie,所以即使您保存了长期有效的 Cookie,用户也可以自行决定将其全部删除,同时清除保存在 Cookie 中的所有设置。

如果没有设置 Cookie 的有效期,还是可以创建 Cookie,但它不会保存到用户的硬盘上,而是会成为用户会话信息的一部分。如果用户关闭浏览器或会话超时,该 Cookie 就会被删除。这种非永久性的 Cookie 很适合用来保存只需短时间保存的信息,或者保存由于安全原因不应该写入客户计算机磁盘的信息。例如,如果用户使用的是一台公用计算机,而您不希望把 Cookie 写入这种计算机的磁盘上,这时就可以使用非永久性的 Cookie。

您可以通过多种方法把 Cookie 添加到 Response.Cookies 集合中。以下示例介绍了两种完成此任务的方法:

Response.Cookies("userName").Value = "mike"
Response.Cookies("userName").Expires = DateTime.Now.AddDays(1)
Dim aCookie As New HttpCookie("lastVisit")
aCookie.Value = DateTime.Now.ToString
aCookie.Expires = DateTime.Now.AddDays(1)
Response.Cookies.Add(aCookie)

该示例向 Cookies 集合中添加了两个 Cookie,一个称为“userName”,另一个称为“lastVisit”。对于第一个 Cookie,我直接设置了 Response.Cookies 集合的值。您可以使用这种方法向集合中添加值,因为 Response.Cookies 是从 NameObjectCollectionBase(英文)类型的特殊集合派生得到的。

对于第二个 Cookie,我创建了 Cookie 对象的一个实例(HttpCookie [英文] 类型),并设置了其属性,然后通过 Add 方法把它添加到 Response.Cookies 集合。实例化 HttpCookie 对象时,您必须把 Cookie 名称作为构造函数的一部分进行传递。

这两个示例完成了相同的任务,即向浏览器写入一个 Cookie。您要采用哪种方法主要取决于您的个人喜好。您可能会发现第二种方法在设置 Cookie 属性方面要稍微容易一些,但同时您也会注意到两者的差别并不是很大。

在这两种方法中,有效期值必须为 DateTime 类型。而“lastVisited”值也是日期/时间值。但在这种情况下,我必须把日期/时间值转换为字符串,因为 Cookie 中的任何值最终都是以字符串的形式保存的。

查看您的 Cookie

您可能会发现,了解创建 Cookie 的效果会对您很有帮助。而查看 Cookie 是比较容易的,因为它们都是文本文件,关键在于您能找到它们。不同的浏览器保存 Cookie 的方式也不同。我将介绍 Internet Explorer 是如何保存 Cookie 的。如果您使用的是其他浏览器,请查看该浏览器的帮助,以了解有关 Cookie 处理方面的知识。

查看 Cookie 的一个简便方法是让 Internet Explorer 为您查找。在 Internet Explorer 中,从“工具”菜单中选择“Internet 选项”,在“常规”选项卡中单击“设置”,然后单击“查看文件”。Internet Explorer 将打开一个窗口,显示所有的临时文件,包括 Cookie。在窗口中查找以“Cookie:”开头的文件 或查找文本文件。双击一个 Cookie,在默认的文本文件中打开它。

您也可以在硬盘上查找 Cookie 的文本文件,从而打开 Cookie。Internet Explorer 将站点的 Cookie 保存在文件名格式为 <user>@<domain>.txt 的文件中,其中 <user> 是您的帐户名。例如,如果您的名称为 mikepope,您访问的站点为 www.contoso.com,那么该站点的 Cookie 将保存在名为 mikepope@www.contoso.txt 的文件中。(该文件名可能包含一个顺序的编号,如 mikepope@www.contoso[1].txt。)

这个 Cookie 文本文件是与用户相关的,所以会按照帐户分别保存。例如,在 Windows XP 中,您可以在如下所示的目录中找到 Cookie 文件:

c:\Documents and Settings\<user>\Cookies

要查找最新创建的 Cookie,可以按修改日期对目录内容进行排序,并查找最近修改的文件。

您可以使用文本编辑器打开 Cookie。如果该文件包含多个 Cookie,这些 Cookie 之间将用星号 (*) 分隔。每个 Cookie 的第一行是 Cookie 的名称,第二行是值,其余各行则包含 Cookie 的日常处理信息,例如过期日期和时间。Cookie 中还有一个简单的校验和,如果更改 Cookie 名称或值的长度,浏览器就会检测到修改并删除该 Cookie。

多值 Cookie(子键)

以上示例为每个要保存的值(用户名、上次访问时间)都使用了一个 Cookie 。您也可以在一个 Cookie 中保存多个名称/值对。名称/值对也称作“键”或“子键”,具体取决于您读取的内容。(如果您熟悉 URL 的结构,就会发现子键与其中的查询字符串非常相象。) 例如,如果不希望创建名为“userName”和“lastVisit”的两个单独的 Cookie,可以创建一个名为“userInfo”的 Cookie,并使其包含两个子键:“userName”和“lastVisit”。

有很多原因会让我们用子键来代替单独的 Cookie。最显而易见的是,把相关或类似的信息放在一个 Cookie 中会比较有条理。另外,由于所有信息都在一个 Cookie 中,所以诸如有效期之类的 Cookie 属性就适用于所有信息。(当然,如果要为不同类型的信息指定不同的过期日期,就应该把信息保存在单独的 Cookie 中。)

带有子键的 Cookie 还可以帮助您减小 Cookie 的大小。如前面的 Cookie 的限制一节所述,Cookie 的总大小限制在 4096 字节以内,而且不能为一个网站保存超过 20 个 Cookie。利用带子键的单个 Cookie,站点的 Cookie 数量就不会超过 20 个的限制。此外,一个 Cookie 会占用大约 50 个字符的基本空间开销(用于保存有效期信息等),再加上其中保存的值的长度,其总和接近 4K 的限制。如果使用五个子键而不是五个单独的 Cookie,您可以省去四个 Cookie 的基本空间开销,总共能节省大约 200 个字节。

要创建带子键的 Cookie,您可以使用用于编写单个 Cookie 的各种语法。以下示例显示了编写同一 Cookie 的两种不同方法,其中的每个 Cookie 都带有两个子键:

Response.Cookies("userInfo")("userName") = "mike"
Response.Cookies("userInfo")("lastVisit") = DateTime.Now.ToString
Response.Cookies("userInfo").Expires = DateTime.Now.AddDays(1)
Dim aCookie As New HttpCookie("userInfo")
aCookie.Values("userName") = "mike"
aCookie.Values("lastVisit") = DateTime.Now.ToString
aCookie.Expires = DateTime.Now.AddDays(1)
Response.Cookies.Add(aCookie)

控制 Cookie 有效范围

默认情况下,一个站点的全部 Cookie 都一起保存在客户机上,而且所有这些 Cookie 都会随着对该站点发送的请求一起发送到服务器,也就是说,站点的每个页面都能得到该站点的所有 Cookie。但有时候,您可能希望 Cookie 更具有针对性,这时,您可以通过两种方法设置 Cookie 的有效范围:

  • 把 Cookie 的有效范围限制在服务器上的一个文件夹中,实际上这样就将 Cookie 限制到站点上的某个应用程序。
  • 把有效范围设置为某个域,从而允许您指定域中的哪些子域可以访问 Cookie。

将 Cookie 限制到某个文件夹或应用程序

要将 Cookie 限制到服务器上的某个文件夹,请按如下方法设置 Cookie 的 Path 属性:

Dim appCookie As New HttpCookie("AppCookie")
appCookie.Value = "written " & Now.ToString
appCookie.Expires = Now.AddDays(1)
appCookie.Path = "/Application1"
Response.Cookies.Add(appCookie)

当然,您也可以通过直接设置 Response.Cookies 来编写 Cookie,如前文所述。

路径可以是站点根目录下的物理路径,也可以是虚拟根目录。这样一来,Cookie 就只能用于 Application1 文件夹或虚拟根目录中的页面。例如,如果您的站点名为 www.contoso.com,则前面示例中生成的 Cookie 就只能用于路径为 http://www.contoso.com/Application1/ 的页面以及该文件夹下的所有页面,而不适用于其他应用程序中的页面,如 http://www.contoso.com/Application2/ 或 http://www.contoso.com/ 下的页面。

提示:通过对 Internet Explorer 和 Mozilla 浏览器进行测试发现,此处使用的路径是区分大小写的。一般而言,Windows 服务器上的 URL 不区分大小写,但这种情况例外。您无法控制用户如何在浏览器中输入 URL,但是,如果您的应用程序依赖于与特定路径相关的 Cookie,则请确保您所创建的所有超链接中的 URL 与 Path 属性值的大小写相匹配。

将 Cookie 的有效范围限制到域

默认情况下,Cookie 与特定的域相关联。例如,如果您的站点是 www.contoso.com,那么当用户向该站点请求页面时,您编写的 Cookie 就被发送到服务器。(有特定路径值的 Cookie 除外,我在上一节刚刚解释过。) 如果您的站点有子域(例如 contoso.com、sales.contoso.com 和 support.contoso.com),就可以把 Cookie 同特定的子域相关联。为此,需要设置 Cookie 的 Domain 属性,如下所示:

Response.Cookies("domain").Value = DateTime.Now.ToString
Response.Cookies("domain").Expires = DateTime.Now.AddDays(1)
Response.Cookies("domain").Domain = "support.contoso.com"

如果按照这种方式设置域,则 Cookie 只能用于指定子域中的页面。

您也可以利用 Domain 属性来创建可在多个子域中共享的 Cookie。例如,对域进行如下设置:

Response.Cookies("domain").Value = DateTime.Now.ToString
Response.Cookies("domain").Expires = DateTime.Now.AddDays(1)
Response.Cookies("domain").Domain = "contoso.com"

这样,该 Cookie 就可用于主域、sales.contoso.com 和 support.contoso.com。

读取 Cookie

当浏览器向服务器发送请求时,该服务器的 Cookie 会与请求一起发送。在 ASP.NET 应用程序中,您可以使用 Request 对象来读取 Cookie。Request 对象的结构与 Response 对象的结构基本相同,所以从 Request 对象中读取 Cookie 的方法与向 Response 对象中写入 Cookie 的方法非常类似。以下示例显示了两种方法,目的都是获取名为“username”的 Cookie 的值并将值显示在 Label 控件中:

If Not Request.Cookies("userName") Is Nothing Then
Label1.Text = Server.HtmlEncode(Request.Cookies("userName").Value)
End If
If Not Request.Cookies("userName") Is Nothing Then
Dim aCookie As HttpCookie = Request.Cookies("userName")
Label1.Text = Server.HtmlEncode(aCookie.Value)
End If

在获取 Cookie 的值之前,应该确保该 Cookie 确实存在。否则,您将得到一个 System.NullReferenceException(英文)异常。还需要注意的是,在页面中显示 Cookie 的内容之前,我调用了 HttpServerUtility.HtmlEncode(英文)方法对 Cookie 的内容进行编码。之所以这样做,是因为我要显示 Cookie 的内容(一般您不会这样做)而且要确保没有任何恶意用户在 Cookie 中添加了可执行脚本。有关 Cookie 安全性的详细信息,请参阅 Cookie 和安全性

注意:由于不同的浏览器保存 Cookie 的方式也不同,所以同一台计算机上的不同浏览器不一定能够相互读取各自的 Cookie。例如,如果使用 Internet Explorer 测试一个页面,然后再使用其他浏览器进行测试,那么后者就不会找到 Internet Explorer 保存的 Cookie。当然,大多数人一般都是使用同一种浏览器进行 Web 交互的,因此在大多数情况下不会出现问题。但有时还是会遇到问题,比如您要测试应用程序对浏览器的兼容性。

读取 Cookie 中子键值的方法与设置该值的方法类似。以下是获取子键值的一种方法:

If Not Request.Cookies("userInfo") Is Nothing Then
Label1.Text = _
Server.HtmlEncode(Request.Cookies("userInfo")("userName"))
Label2.text = _
Server.HtmlEncode(Request.Cookies("userInfo")("lastVisit"))
End If

在上面的示例中,我获取的是子键“lastVist”的值,在此前的讨论中我把该值设置为 DateTime 值的字符串表示形式。请记住,Cookie 是用字符串的形式保存值的,所以要将 lastVisit 值用作日期,就必须对其进行转换:

Dim dt As DateTime
dt = CDate(Request.Cookies("userInfo")("lastVisit"))

Cookie 中子键的类型是 NameValueCollection(英文)类型的集合。因此,另一种获取单个子键的方法是先获取子键集合,然后按名称提取子键的值,如下所示:

If Not Request.Cookies("userInfo") Is Nothing Then
Dim UserInfoCookieCollection As _
System.Collections.Specialized.NameValueCollection
UserInfoCookieCollection = Request.Cookies("userInfo").Values
Label1.Text = Server.HtmlEncode(UserInfoCookieCollection("userName"))
Label2.Text = Server.HtmlEncode(UserInfoCookieCollection("lastVisit"))
End If

就像设置 Cookie 一样,使用哪种方法读取 Cookie 也由您自己决定。

什么是有效期?

您可以读取 Cookie 的名称和值,除此以外,需要了解的有关 Cookie 的信息并不是很多。虽然您可以获取 DomainPath 属性,但是这些属性的用途很有限。例如,您可以读取 Domain 属性,但如果您的页面与 Cookie 不在相同的域,您根本就不会在页面的位置接收到该 Cookie。

您无法读取的是 Cookie 的过期日期和时间。事实上,当浏览器向服务器发送 Cookie 信息时,浏览器并未将过期信息包括在内。您可以读取 Expires 属性,但总是返回为零的日期/时间值。

在前面的编写 Cookie 一节中,我已经讲过,是浏览器负责管理 Cookie 的,Expires 属性就很好地印证了这一点。Expires 属性的主要作用是帮助浏览器执行有关 Cookie 保存的日常管理。从服务器的角度来看,Cookie 要么存在要么不存在,所以对服务器而言,有效期并不是有用的信息。所以,浏览器在发送 Cookie 时并不提供此信息。如果您需要 Cookie 的过期日期,就必须重新设置,关于这一点我将在修改和删除 Cookie 中介绍。

更确切地说,您可以在向浏览器发送 Cookie 之前读取已在 Response 对象中设置的 Expires 属性,但您无法从返回的 Request 对象中获取有效期信息。

读取 Cookie 集合

前面的示例假设您要读取名称已知的 Cookie。有时,您可能需要读取可供页面使用的所有 Cookie。要读取可供页面使用的所有 Cookie 的名称和值,您可以利用如下代码遍历 Request.Cookies 集合:

Dim i As Integer
Dim output As String = ""
Dim aCookie As HttpCookie
For i = 0 to Request.Cookies.Count - 1
aCookie = Request.Cookies(i)
output &= "Cookie 名称 = " & Server.HtmlEncode(aCookie.Name) & "<br>"
output &= "Cookie 值 = " & Server.HtmlEncode(aCookie.Value) & _
& "<br><br>"
Next
Label1.Text = output
注意:运行此代码时,您很可能会看到一个名为“ASP.NET_SessionId”的 Cookie,ASP.NET 用这个 Cookie 来保存您的会话的唯一标识符。这个会话 Cookie 不会永久保存到您的硬盘上。有关会话 Cookie 的详细信息,请参阅本文后面的 Cookie 和会话状态

前面的示例有一个限制:如果 Cookie 有子键,就会以一个单独的名称/值字符串来显示子键。Cookie 的 HasKeys(英文)属性可以告诉您该 Cookie 是否有子键。如果有子键,您可以在子键集合中向下钻取,获取各个子键的名称和值。

如前文所述,您可以从 Cookie 属性 Values(英文)中获取有关子键的信息,该属性是类型 NameValueCollection 的集合。您可以根据索引值从 Values 集合中直接读取子键值。相应的子键值可以从 Values 集合的成员 AllKeys(英文)中得到,该成员将返回一个字符串集合。

以下示例是对前一示例的修改。示例中使用 HasKeys 属性来测试子键,如果检测到子键,就从 Values 集合中获取子键:

Dim i As Integer
Dim j As Integer
Dim output As String = ""
Dim aCookie As HttpCookie
Dim subkeyName As String
Dim subkeyValue As String
For i = 0 To Request.Cookies.Count - 1
aCookie = Request.Cookies(i)
output &= "名称 = " & aCookie.Name & "<br>"
   If aCookie.HasKeys Then
      For j = 0 To aCookie.Values.Count - 1
         subkeyName = Server.HtmlEncode(aCookie.Values.AllKeys(j))
         subkeyValue = Server.HtmlEncode(aCookie.Values(j))
         output &= "子键名称 = " & subkeyName & "<br>"
         output &= "子键值 = " & subkeyValue & "<br><br>"
     Next
   Else
output &= "值 = " & Server.HtmlEncode(aCookie.Value) & "<br><br>"
End If
Next
Label1.Text = output

您也可以把子键作为 NameValueCollection 对象进行提取,如下所示:

If aCookie.HasKeys Then
   Dim CookieValues As _
      System.Collections.Specialized.NameValueCollection = aCookie.Values
   Dim CookieValueNames() As String = CookieValues.AllKeys
   For j = 0 To CookieValues.Count – 1
      subkeyName = Server.HtmlEncode(CookieValueNames(j))
      subkeyValue = Server.HtmlEncode(CookieValues(j))
output &= "子键名称 = " & subkeyName  & "<br>"
output &= "子键值 = " & subkeyValue & "<br><br>"
Next
Else
output &= "值 = " & aCookie.Value & "<br><br>"
End If
注意:请记住,我之所以调用 Server.HtmlEncode 方法,只是因为我要在页面上显示 Cookie 的值。如果您只是测试 Cookie 的值,就不必在使用前对其进行编码。

修改和删除 Cookie

有时,您可能需要修改某个 Cookie,更改其值或延长其有效期。(请记住,由于浏览器不会把有效期信息传递到服务器,所以您无法读取 Cookie 的过期日期。)

当然,实际上您并不是直接更改 Cookie。尽管您可以从 Request.Cookies 集合中获取 Cookie 并对其进行操作,但 Cookie 本身仍然存在于用户硬盘上的某个地方。因此,修改某个 Cookie 实际上是指用新的值创建新的 Cookie,并把该 Cookie 发送到浏览器,覆盖客户机上旧的 Cookie。

以下示例说明了如何更改用于储存站点访问次数的 Cookie 的值:

Dim counter As Integer
If Request.Cookies("counter") Is Nothing Then
counter = 0
Else
counter = CInt(Request.Cookies("counter").Value)
End If
counter += 1
Response.Cookies("counter").Value = counter.ToString
Response.Cookies("counter").Expires = DateTime.Now.AddDays(1)

或者:

Dim ctrCookie As HttpCookie
Dim counter As Integer
If Request.Cookies("counter") Is Nothing Then
ctrCookie = New HttpCookie("counter")
Else
ctrCookie = Request.Cookies("counter")
End If
counter = CInt(ctrCookie.Value) + 1
ctrCookie.Value = counter.ToString
ctrCookie.Expires = DateTime.Now.AddDays(1)
Response.Cookies.Add(ctrCookie)

删除 Cookie

删除 Cookie(即把该 Cookie 从用户的硬盘上物理删除)是修改 Cookie 的一种形式。由于 Cookie 位于用户的计算机中,所以您无法直接将其删除。但是,您可以让浏览器为您删除 Cookie。修改 Cookie 的方法前面已经介绍过(即用相同的名称创建一个新的 Cookie),不同的是将其有效期设置为过去的某个日期。当浏览器检查 Cookie 的有效期时,就会删除这个已过期的 Cookie。

所以,删除 Cookie 的方法与创建该 Cookie 的方法是相同的,只不过要把其有效期设置为过去的某个日期。以下示例比删除单个 Cookie 要稍微有趣一些,它使用的方法可以删除当前域的所有 Cookie:

Dim i As Integer
Dim cookieName As String
Dim limit As Integer = Request.Cookies.Count - 1
For i = 0 To limit
aCookie = Request.Cookies(i)
   aCookie.Expires = DateTime.Now.AddDays(-1)
Response.Cookies.Add(aCookie)
Next

修改或删除子键

修改单个子键的方法与最初创建它的方法相同:

Response.Cookies("userInfo")("lastVisit") = DateTime.Now.ToString
Response.Cookies("userInfo").Expires = DateTime.Now.AddDays(1)

比较复杂的问题是如何删除单个子键。您不能只是简单地重新设置 Cookie 的过期日期,因为这样只能删除整个 Cookie 而不能删除单个子键。实际的解决方案是对包含子键的 Cookie 的 Values 集合进行操作。首先,通过从 Request.Cookies 对象中获取 Cookie 来重新创建 Cookie。然后,您就可以调用 Values 集合的 Remove 方法,将要删除的子键名称传递到 Remove 方法。接下来,您通常可以将修改后的 Cookie 添加到 Response.Cookies 集合,以便将修改后的 Cookie 发送回浏览器。

以下代码显示了如何删除子键。在示例中,要删除的子键的名称在变量中指定。

Dim subkeyName As String
subkeyName = "userName"
Dim aCookie As HttpCookie = Request.Cookies("userInfo")
aCookie.Values.Remove(subkeyName)
aCookie.Expires = DateTime.Now.AddDays(1)
Response.Cookies.Add(aCookie)

Cookie 与安全性

在使用 Cookie 时,您必须意识到其固有的安全弱点。我所指的安全性并不是隐私问题,正如我在前面的什么是 Cookie?中所述,隐私在更大程度上是某些用户面对的问题:这些用户很关心 Cookie 中的信息是如何被使用的。而 Cookie 的安全性问题与从客户机获取数据的安全性问题类似。对于初学者,就应用程序而言,Cookie 是用户输入的另一种形式,因而很容易被他人非法获取和利用。由于 Cookie 保存在用户自己的计算机上,所以用户至少可以看到您保存在 Cookie 中的信息。如果用户愿意,还能在浏览器向您发送 Cookie 之前修改该 Cookie。

所以,您千万不要在 Cookie 中保存保密信息 - 用户名、密码、信用卡号等等。在 Cookie 中不要保存不应该由用户掌握的内容,也不要保存可能被其他窃取 Cookie 的人控制的内容。

同样,要对从 Cookie 中得到的任何信息都持怀疑态度。不要认为得到的数据就是您当初设想的信息。处理 Cookie 值时采用的安全措施应该与处理 Web 页面中用户键入的数据时采用的安全措施相同。例如,在页面中显示值之前,我会对 Cookie 中的内容进行 HTML 编码。这是一种标准的方法,可以在显示之前净化从用户处得到的信息,对 Cookie 的处理与此相同。

另一个需要关心的问题是,Cookie 是以纯文本的形式在浏览器和服务器之间传送的,任何可以截取 Web 通信的人都可以读取 Cookie。您可以对 Cookie 的属性进行设置,使其只能在使用安全套接字层(SSL,又称 https://)的连接上传输。SSL 并不能防止保存在用户计算机上的 Cookie 被他人读取或操作,但它能防止 Cookie 在传输途中被他人截取。本文不讨论 SSL,但您必须清楚,您可以对 Cookie 进行传输保护。有关 SSL 的详细信息,请参阅 Secure Sockets Layer: Protect Your E-Commerce Web Site with SSL and Digital Certificates(英文)。

面对这些安全问题,如何才能安全地使用 Cookie?您可以在 Cookie 中保存一些不重要的数据,如用户首选项或其他对应用程序没有重大影响的信息。如果确实需要把某些敏感信息(如用户 ID)保存在 Cookie 中,就对这些信息进行加密。一种可行的方法是利用 ASP.NET Forms Authentication 实用程序创建一个身份验证票据,作为 Cookie 保存。本文不讨论有关加密的问题,但是,如果您需要在 Cookie 中保存敏感信息,就应该试着采取措施来隐藏信息,防止被他人盗用。

Mitigating Cross-site Scripting With HTTP-only Cookies(英文)一文中,您可以了解到更多有关 Cookie 及其安全弱点的信息。

检查浏览器是否接受 Cookie

我在前面的 Cookie 的限制一节中曾经提到一个潜在问题,即用户可以设置自己的浏览器拒绝接受 Cookie。如何才能知道您是否可以读写 Cookie?在不能写入 Cookie 时不会出现任何错误(例如 Response.Cookies 不会抛出异常),因为服务器并不跟踪呈现页面后出现的情况。浏览器同样不会向服务器发送任何有关其当前的 Cookie 设置的信息。(也许您需要了解,但 HttpBrowserCapabilities.Cookies Property [英文] 属性并不会告诉您 Cookie 是否被启用,而只能告诉您当前的浏览器是否支持 Cookie。)

一种确定浏览器是否接受 Cookie 的方法是先编写一个 Cookie,然后再尝试读取这个 Cookie。如果不能读取这个 Cookie,则可以认为该浏览器不接受 Cookie。

我编写了一个简单的示例来说明如何测试 Cookie 是否被接受。该示例包含两个页面。在第一个页面中,我编写了一个 Cookie,然后把浏览器重新定向到第二个页面。第二个页面尝试读取这个 Cookie,转而将浏览器重新定向到第一个页面,并向 URL 添加一个带有测试结果的查询字符串变量。

第一个页面的代码如下:

Sub Page_Load()
If Not Page.IsPostBack Then
If Request.QueryString("AcceptsCookies") Is Nothing Then
Response.Cookies("TestCookie").Value = "ok"
Response.Cookies("TestCookie").Expires = _
DateTime.Now.AddMinutes(1)
Response.Redirect("TestForCookies.aspx?redirect=" & _
Server.UrlEncode(Request.Url.ToString))
Else
labelAcceptsCookies.Text = "接受 Cookie = " & _
Request.QueryString("AcceptsCookies")
End If
End If
End Sub

第一个页面测试是否有回信,如果没有,就搜索包含测试结果的查询字符串变量 (AcceptsCookies)。如果没有找到查询字符串变量,则表示测试还没有完成,代码就写出一个名为“TestCookie”的 Cookie。写出 Cookie 之后,示例调用 Response.Redirect 来切换到测试页面 (TestForCookies.aspx)。附加到测试页面的 URL 的是名为 redirect 的查询字符串变量,该变量中包含了当前页面的 URL,这样就能在执行测试后把重定向到该页面。

测试页面可以完全由代码组成,不需要包含控件。以下就是我使用的代码:

Sub Page_Load()
Dim redirect As String = Request.QueryString("redirect")
Dim acceptsCookies As String
' 是否接受 Cookie?
If Request.Cookies("TestCookie") Is Nothing Then
' 没有 Cookie,因此不需要接受
acceptsCookies = 0
Else
acceptsCookies = 1
' 删除测试 Cookie
Response.Cookies("TestCookie").Expires = _
DateTime.Now.AddDays(-1)
End If
Response.Redirect(redirect & "?AcceptsCookies=" & acceptsCookies, _
True)
End Sub

读取 redirect 查询字符串变量后,代码就尝试读取 Cookie。为了实现日常管理,如果该 Cookie 确实存在,就会被立即删除。测试完成后,代码从 redirect 查询字符串变量传递的 URL 构造一个新的 URL。新的 URL 也包括一个包含测试结果的查询字符串变量。最后一步是使用新的 URL 将浏览器重定向到原来的页面。

这个示例十分简单,但说明了通过运行程序并查看结果来进行测试的基本原则。其中最需要改进的地方是要永久保存 Cookie 测试结果,这样用户就不必在每次浏览原始页面时都重复进行测试。但是,实际上并不能做到这一点。Cookie 不会起作用,原因是显而易见的。另一种可能是把测试结果保存在会话状态中,但在默认情况下,会话状态也依赖于 Cookie,而如果浏览器不接受 Cookie,会话状态也不会起作用。解决后一个问题的办法是采用无 Cookie 的会话状态。下一节我将简要介绍会话状态如何与 Cookie 协作。

Cookie 和会话状态

当用户访问您的站点时,服务器会为该用户创建唯一的会话,会话将一直延续到用户访问结束。对于每个会话,ASP.NET 都维护一种基于服务器的结构(会话状态),在该结构中应用程序可以保存用户的相关信息。有关详细信息,请参阅 Session State(英文)。

ASP.NET 需要能跟踪每个用户的会话 ID,这样才能把用户映射到服务器上的会话状态信息。默认情况下,ASP.NET 使用一个非永久性的 Cookie 来保存会话状态。如果您使用读取 Cookie 一节的“读取 Cookie 集合”中的示例,您可能就会在 Cookie 中发现一个会话状态 Cookie。

但是如果用户禁用了浏览器的 Cookie,会话状态就不能使用 Cookie 来保存会话 ID,会话状态也不会起作用。这就是为什么我在前面的检查浏览器是否接受 Cookie 中说,无法在 Cookie 测试完毕后把测试结果实际保存在会话状态中,因为没有 Cookie 就没有会话状态。

ASP.NET 提供了一种解决方案,即利用无 Cookie 的会话。您可以配置自己的应用程序,不在 Cookie 中保存会话 ID,而是在站点页面的 URL 中保存。会话 ID 保存在 URL 中,也就是 ASP.NET 将 ID 保存在浏览器中,从而能够在用户请求其他页面时取回 ID。

无 Cookie 会话可以避免浏览器拒绝 Cookie 的问题,使您能够使用会话状态。如果您的应用程序依赖于会话状态,您可能就需要对其进行配置,使它能使用无 Cookie 会话。但是,在某些情况下,如果用户与其他人共享 URL - 可能是用户通过电子邮件将 URL 发送给同事,而该用户的会话仍然处于激活状态 - 那么最终这两个用户可能共享同一个会话,结果将难以预料。

有关配置应用程序以使用无 Cookie 会话的详细信息,请参阅 Knowledge Base 中的文章 INFO: ASP.NET State Management Overview(英文)。

posted @ 2007-04-27 15:09 水源 阅读(515) | 评论 (0)编辑

expression web 视频教程 19讲 数据视图
大家好 今天给大家讲 数据视图
数据视图 主要是数据库方面的知识点 因为是初级教程 所有我不给大家将太深入 多了大家也消化不

了 另外自己也不会
让大家见笑了 ! ~
开始 我给大家简单介绍一些 建立数据源的链接 看操作 首先准备数据库文件 可以是 Access SQL 等

很多数据
我给大家用ACCESS 做  其他的如果大家感兴趣 可以看相关的资料 也可以看田大哥的教程  那里面也

有 
另外控件部分 我也不给大家一一讲解了 我只有一两个控件
 看操作 ~~~
大家看见了 数据源里面有 本地xml文件 和 Asp.net连接两个
我先给大家将Asp.net这个 首先 先在工具箱 里面找到Asp.net控件-数据-

如果没有这个 可以在任务窗口里面调整出来
拖入一个 gridview 之后我们建立数据源
数据库可以来自不同的数据源 我们选access
这个是我们准备好的  需要自己建立 放在站点的下面
登录数据库的密码和用户名 我们都不要 设置为空
高级是数据库连接的具体的设置 大家可以看看
出来一个 新建链接的对话框
大家给起一个名字
保存在web.config文件里面
为了以后大家使用的时候不用重新建立
所有建议这样操作
之后我们就让我们建立的数据在网页上面显示了
这些是sql语句
是了检索数据用的 我们选择默认的
当然也可以选中自定义的
这些需要自己多练习 和有相关的sql的基础
看来了把 下面出现我们的sql语句了
实际上选择第一里面自定义 也可以实现相同的效果
看见了吧 效果都是一样的
可以设置一些详细的 比如条件查询 排序
在返回唯一值等
我就不做那些了
看见这些实际上和 .net 2005的视图是一样的
可以编辑一些东西 大家参考一些相关的知识就可以了
看看效果了
等待一会 机器有些慢 另外启动iis服务当然就慢了 呵呵
看见了吧
当然这需要设置一下 iis 了
我给大家演示一下
看操作 如果没有的 可以安装 iis
我就不给大家安装了
选择自己的站点的目录
看见了吧
我已经建好了 点击浏览就可以了
我给大家 做第一种
首先 建立一个 xml
我就为了 节省时间  所有就不新建了
格式就如上面的那样就可以了
如果视图里面没有就用这样的方式导入
不在网站目录下面
就把xml文件复制到网站目录下面就可以了
显示视图  
每条记录 都显示了
看看效果 
出现了 呵呵 成功 ~~~~~~~~~~
可以设置显示的条件
看操作
看见了吧 具体我自己还晕这呢
自己多练习 看看相关的知识就可以了
明白了吧 当等于601的就显示 上面的等于60的就不显示了
当然也可以设置条件为一个范围了 比如>< >= <= !=等
我就不一一演示了
看看效果了  ~
效果明显了 
今天就讲解到这 谢谢大家观看  ~~
发布网站 http://hi.baidu.com/sr521
88
下载地址

posted @ 2007-03-28 10:51 水源 阅读(480) | 评论 (4)编辑

expression web 视频教程 18讲 网站
大家好,很长时间没有录制教程了,今天开始18讲 网站,其实后面没有什么了 数据视图 其实都是一些编程方面的
如果大家需要  参考一下 田大哥的教程 那么这些东西就简单了 因为expression web主要还是开发前台的
另外我
主要将一些常见的用法,这些足够大家开发所有了。看操作

1文件夹 这些其实就是以前讲过的那些东西
2远程网站 我们使用ftp这个 大家也可以用Ftp的工具
第四项实际就是那些有自己的服务器 并且在自己的服务器开发的 做为网站的使用
实际也很常见
优化HTML 看见了吧 优化了一些东西 来降低网站的大小
大家看说明

3报表【其实就是网站文件按照分类分开查找】比较方便管理
分的很详细
我给大家讲这个 慢速网页
因为开发的时候 如果文件大 会影响网站的浏览的速度 换一个说法
就是说用户的体验不好 打开网页很长时间都没有显示
这个功能就可以设置 多长时间为慢速度的网页
实际上 用这个30就可以
其他的功能我就不给大家一一介绍了 大家自己看都能看明白
比如链接的那个

4超链接 点击左边的文件夹列表
任何一个网页
就会显示出和他链接的文件
以树形的结构显示

5重新计算机链接
看上面的说明 看见了吧 这里面有一个错误
其实是expression web 但是确实Frontpage
大概是翻译的问题 或者是我的版面的问题 这个我就不讨论了

6网站设置 可以修改网站名称 可以设置预览
我给大家看看具体 的各项的内容
好像我在前面已经讲过了
在高级里面
可以设置脚本 看大家喜欢那种 javascript 还是 vbscript
设置 网页的默认编码 我给大家看一下 那个编码在实际代码里面
是那个设置 看~就是那个
当我们修改之后 新建的文件就变成了 新的编码了
给大家演示一下 看见了吧 我恢复默认的
数据库这个 就是管理数据库结构向导使用的数据库链接
当然大家需要的动态部分的时候 这个里面就会有东西了
谢谢大家的观看 
分布地址 http://hi.baidu.com/sr521我的博客
大家有什么不懂的 和不太明白的地方 可以给我留言
88
下载地址

posted @ 2007-03-26 09:19 水源 阅读(920) | 评论 (2)编辑

expression web 视频教程第17节  表格菜单
大家好
今天讲解表格菜单 看操作
设置 最下面 是下次使用插入表格的时候设置为默认值
这个是以什么为分界来转换表格
可以自己设置

 

我是效果 我设置页边距为0  大家观察效果 看见吧

浮动效果 大家看下面的表格和我上面的这行字的位置关系,大家就知道浮动是什么效果了效果出来了吧

 

 

看了吧 都消失了 ,删除的是整个表格。把所有的整个表格都删除了。下面是表格的所有属性 我会在帖子里面发布的.这个就是设置具体的单元格的背景和边框等属性。

在“表格属性”对话框中,执行下列操作:

具体选项 实际作用
大小 设置表格中的行数和列数。
对齐方式 设置表格的水平对齐方式。
浮动 设置表格的浮动属性。
指定宽度 设置表格的宽度。
指定高度 设置表格的高度。
单元格衬距 设置单元格之间的衬距。
单元格间距 设置单元格内的间距。
边框 设置表格边框的粗细和颜色。
背景 设置要用作表格背景的颜色或背景图片。
启用布局工具 选中此项以启用布局工具。
设为新表格的默认值 选中此项以对新建的所有表格应用这些设置。

最后给大家讲 布局表格

布局表格

布局表格是一种可用来创建网页方案的工具。在 HTML 中,它看上去与表格没有两样,但 Microsoft® Expression® Web 却为表格和布局表格提供了不同的编辑工具。使用“布局表格”任务窗格中提供的预定义布局表格,可以帮助您在网页上快速创建布局表格。还可以通过绘制表格和单元格来创建自己的自定义布局表格。

单击布局表格或单元格的边框将其激活后,每条边上都会出现显示列宽和行高的标签。每个标签都包含一个下拉箭头,可以单击该箭头查看用于调整列或行的大小的选项列表。

激活的布局表格

 

添加布局表格

  • 在“布局表格”任务窗格中,执行下列操作之一:
    • 若要选择预定义的布局表格,请在“表格布局”下的模板列表中选择一种布局表格。
    • 若要绘制布局表格,请单击“绘制布局表格” 按钮,再使用指针在网页上绘制表格。

向布局表格中添加单元格

  1. 在“布局表格”任务窗格中,单击“绘制布局单元格” 按钮。
  2. 使用指针在网页上的布局表格中绘制单元格。

    提示 若要连续绘制两个或更多的单元格,请单击“绘制布局单元格”,然后在按住 Ctrl 的同时拖动指针。

删除布局单元格

  • 单击布局单元格的边框,再按 Delete。

删除布局表格

  • 在“布局表格”任务窗格中,单击“显示布局工具” 按钮以激活布局表格,再按 Delete。

 

sdfsdsdsdfdsfsdsdds 看来吧 大家大家看明白没有 填充是文字填充 另外必须选中表格 看见了效果了吧 sdfsdsdsdfdsfsdsdds 看来吧 大家大家看明白没有 填充是文字填充 另外必须选中表格
sdfsdsdsdfdsfsdsdds 看来吧 大家大家看明白没有 填充是文字填充 另外必须选中表格 sdfsdsdsdfdsfsdsdds 看来吧 大家大家看明白没有 填充是文字填充 另外必须选中表格
sdfsdsdsdfdsfsdsdds 看来吧 大家大家看明白没有 填充是文字填充 另外必须选中表格 sdfsdsdsdfdsfsdsdds 看来吧 大家大家看明白没有 填充是文字填充 另外必须选中表格
sdfsdsdsdfdsfsdsdds 看来吧 大家大家看明白没有 填充是文字填充 另外必须选中表格 sdfsdsdsdfdsfsdsdds 看来吧 大家大家看明白没有 填充是文字填充 另外必须选中表格

若要小幅度调整大小,请按住 Alt,再拖动边框以调整其大小。

我重新插入一个表格

这个是调整大小的
这个表格就是布局的表格  
看见了吧 看见效果了吧 很好有 不用麻烦的拆分表格了

布局表格 给我们提供了几种固定的样式

 

最后我给大家讲一个功能

都发生代理费精神动力发生了斯蒂芬及时的 斯蒂芬森都发生代理商的都发生大发利
看来吧 效果 效果出来了 就是给大家提供了一些表格的解决方案

谢谢大家的 学习 今天就讲到这 88

下载地址

posted @ 2007-03-14 14:53 水源 阅读(301) | 评论 (0)编辑

第16讲:工具菜单

third party

拼写检查:主要是检查拼写错误 ,如果出现上面的拼写错误 就会出现提示

同义词库:就是在内容中 你修改相近的次使用

中文简繁转换 :这个里面讲的是多语言版本的制作 比如大的网站 google 有很多语言版面网站,但是我们在地址栏打入地址 访问的确实 中文版 大家明白了吧

 

设置语言:当然需要根据我们使用的语言了 明白了吧  根据设置语言 拼写等功能也跟着改变。

辅助功能报告:这个我不仔细说了

通过检查网页的辅助功能问题并予以解决,可以改善残障人士访问网站时的体验。除了许多其他类型的辅助功能问题以外,残障人士在阅读文本时可能会有困难,也可能无法使用键盘或鼠标。

通过对在 Microsoft® Expression® Web 中创建或编辑的网页使用辅助功能检查器,可以发现与万维网联合会 (W3C) 网站内容辅助功能准则 (WCAG) 或美国康复法案第 508 条的辅助功能准则相冲突的问题。WCAG 概括了使残障人士能够访问网站的优先注意事项。第 508 条则概括了美国政府对各种信息源和技术制定的辅助功能标准。

与这些准则冲突的问题会使残障人士难以或无法使用网站。辅助功能检查器(可通过按一次按键来启动)还会对不属于您的网站的网页进行检查。当您使用辅助功能检查器时,还可以向所生成的报告添加检查列表。使用此检查列表,有助于在解决辅助功能问题时对这些问题进行审阅和跟踪。报告和可选的检查列表可以打印出来或另存为网页。

对一个或多个网页使用辅助功能检查器时,结果会显示在一个对话框中。每一项单独显示为一行,并且该对话框中的结果会指示问题是与 WCAG 冲突还是与第 508 条的准则冲突。此外,该对话框还会显示问题说明、指向该问题的联机准则的超链接、在网页中发现问题的 HTML 代码行。因为问题显示在列表中,所以可以一次一个地审阅,可以打印出来,也可以保存下来以供将来审阅。如果将结果存储为网页,则可以在 Expression Web 中编辑该网页,也可以将其保存到网站或 Intranet 网站上。

辅助功能检查器所使用的准则

遵循 WCAG
WCAG 准则解释了如何使残障人士能够访问网站内容。包括优先级为 1 和 2 的准则。
  • 如果不遵循优先级为 1 的准则,则“一组或多组用户将发现无法访问信息”。优先级为 1 的问题示例:“为每个非文本元素提供对等文本(例如,通过“alt”、“longdesc”,或在元素内容中提供)”。非文本元素包括图形、Macromedia Flash 动画、Java 小程序等。
  • 如果不遵循优先级为 2 的准则,则“一组或多组使用者将发现难以访问信息”。优先级为 2 的问题示例:“如果存在合适的标记语言,则使用标记而不是图像来传达信息。”
遵循第 508 条
此条款要求访问美国联邦代理机构所使用的电子和信息技术。第 508 条的准则不划分优先级,但是有许多准则与 WCAG 优先级为 1 和 2 的准则相似。

 

兼容性报告

兼容性报告可用来查看网页的代码错误以及与所指定的架构不兼容的代码。可以生成一个报告,仅限于查看特定的档或者整个网站。

 

css报表

优化HTML

载入项:

加载项是一些补充程序,它们通过添加自定义命令和专门功能来扩展 Microsoft® Expression® Web 的功能。您可以从第三方供货商处获取加载项,也可以使用外部编译程序(如 Microsoft Visual Studio)编写自己的自定义加载项程序。

为了节省内存和提高 Expression Web 的速度,最好将不经常使用的加载项程序删除。一旦删除加载项,其功能和命令也会从 Expression Web 中删除,但是加载项文件本身会保留在计算机上,这样在需要时可以轻松添加。

自定义

应用程序选项

网页编辑器选项

这两个选项 基本不用修改 今天就讲到这

我将在以后给大家一些应用软件的视频教程 88

下载地址

posted @ 2007-03-12 14:15 水源 阅读(356) | 评论 (0)编辑
     摘要: 12讲:【定位】语法:position : static | absolute | fixed | relative 取值: static :  默认值。无特殊定位,对象遵循HTML定位规则 absolute :  将对象从文档流中拖出,使用 left , right , top , bottom 等属性相对于其最接近的一个最有定位设置的父对象进行绝对定位。如果不存在这样的父对象,则依据 body... 阅读全文
posted @ 2007-03-09 15:23 水源 阅读(1083) | 评论 (2)编辑

11讲 这些Css样式都是网络找的资料,如果大家想深入给我留言。要不我就跳过这些东西。但是我会把相关的参考资料贴出来。谢谢大家关注

语法:
background-repeat : repeat | no-repeat | repeat-x | repeat-y
取值:
repeat :  默认值。背景图像在纵向和横向上平铺
no-repeat :  背景图像不平铺
repeat-x :  背景图像仅在横向上平铺
repeat-y :  背景图像仅在纵向上平铺
说明:
设置或检索对象的背景图像是否及如何铺排。必须先指定对象的背景图像( background-image )。
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 backgroundRepeat
示例:
menu { background: url("images/aardvark.gif"); background-repeat: repeat-y; }
p { background: url("images/aardvark.gif"); background-repeat: no-repeat; }

================================================

语法:
background-position-x : length | left | center | right
取值:
length :  百分数 | 由浮点数字和单位标识符组成的长度值。请参阅 长度单位
left :  居左
center :  居中
right :  居右
说明:
设置或检索对象的背景图像横坐标位置。必须先指定 background-image 属性。
该属性定位不受对象的补丁属性( padding )设置影响。
默认值为: 0%
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 backgroundPositionX
示例:
p { background-image: url("images/aardvark.gif"); background-position-x: 35%; background-repeat:no-repeat; }

=============================================

语法:
background-position-y : length | top | center | bottom
取值:
length :  百分数 | 由浮点数字和单位标识符组成的长度值。请参阅 长度单位
top :  居顶
center :  居中
bottom :  居底
说明:
设置或检索对象的背景图像纵坐标位置。必须先指定 background-image 属性。
该属性定位不受对象的补丁属性( padding )设置影响。
默认值为: 0%
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 backgroundPositionY
示例:
div { background-image: url("images/aardvark.gif"); background-position-y: 35%; background-repeat:no-repeat; }

===============================

background-attachment : scroll | fixed
取值:
scroll :  默认值。背景图像是随对象内容滚动
fixed :  背景图像固定
说明:
设置或检索背景图像是随对象内容滚动还是固定的。
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
请参阅 bgProperties 属性(特性)。对应的脚本特性为 backgroundAttachment
示例:
html { background-image: url("anasazi.tif"); background-attachment: fixed; }
body { background-attachment: scroll; }
dsfsdfsdfsdf dsfdssdfsdds
dsfdsds dsfsddsds
posted @ 2007-03-06 15:53 水源 阅读(312) | 评论 (0)编辑
 

10这节讲【块】div[参考网络一些信息]

letter-spacing

语法:
letter-spacing : normal | length
取值:
normal :  默认值。默认间隔
length :  由浮点数字和单位标识符组成的长度值,允许为负值。请参阅长度单位
说明:
检索或设置对象中的文字之间的间隔。
该属性将指定的间隔添加到每个文字之后,但最后一个字将被排除在外。
字符间距会受对齐调整影响。
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 letterSpacing
示例:
div {letter-spacing:6px; }
div {letter-spacing:0.5pt; }

=====================

语法:
line-height : normal | length
取值:
normal :  默认值。默认行高
length :  百分比数字 | 由浮点数字和单位标识符组成的长度值,允许为负值。其百分比取值是基于字体的高度尺寸。请参阅 长度单位
说明:
检索或设置对象的行高。即字体最底端与字体内部顶端之间的距离。
行高是字体下延与字体内部高度的顶端之间的距离。为负值的行高可用来实现阴影效果。
假如一个格式化的行包括不止一个对象,则最大行高会被应用。在这种情况下,此属性不可以为负值。
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 lineHeight
示例:
div {line-height:6px; }
div {line-height:10.5; }

=================

text-indent : length
取值:
length :  百分比数字 | 由浮点数字和单位标识符组成的长度值,允许为负值。请参阅 长度单位
说明:
检索或设置对象中的文本的缩进。默认值为 0
在被另一个对象(如 br )断开的对象内不能应用本属性。
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 textIndent
示例:
DIV { text-indent:2cm }
.click1 { text-indent:50% }
.click2 { text-indent: }

=========================

语法:
text-align : left | right | center | justify
取值:
left :  默认值。左对齐
right :  右对齐
center :  居中对齐
justify :  两端对齐
说明:
设置或检索对象中文本的对齐方式。
此属性作用于所有块对象(block elements)。在一个 div 对象里的所有块对象的会继承此属性值。 假如属性没有设置,这个参数将获取 null 值。
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 textAlign
示例:
div { text-align : center; }

===================

语法:
white-space : normal | pre | nowrap
取值:
normal :  默认值。默认处理方式。文本自动处理换行。假如抵达容器边界内容会转到下一行
pre :  换行和其他空白字符都将受到保护。这个值需要IE6+或者 !DOCTYPE 声明为 standards-compliant mode 支持。如果 !DOCTYPE 声明没有指定为 standards-compliant mode ,此属性可以使用,但是不会发生作用。结果等同于 normal 。参阅 pre 对象
nowrap :  强制在同一行内显示所有文本,直到文本结束或者遭遇 br 对象。参阅 noWrap 属性
说明:
设置或检索对象内空格字符的处理方式。
空格字符,像换行,空格,TAB,在HTML文档中默认的是被忽略的。当此属性设置为 normal 或者 nowrap 时,你可以使用不换行空格的命名实体 &nbsp; 来添加空格,用 br 元素来添加换行。此属性对你使用文档对象模型(DOM)操作的内容的影响与其对IE显示内容的影响一样。
此属性作用于块对象。
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 whiteSpace
示例:
p { white-space: nowrap; }

======================

语法:
vertical-align : auto | baseline | sub | super | top | text-top | middle | bottom | text-bottom | length
取值:
auto :  CSS1 根据 layout-flow 属性的值对齐对象内容
baseline :  CSS1 默认值。将支持 valign 特性的对象的内容与基线对齐
sub :  CSS1 垂直对齐文本的下标
super :  CSS1 垂直对齐文本的上标
top :  CSS1 将支持 valign 特性的对象的内容对象顶端对齐
text-top :  CSS1 将支持 valign 特性的对象的文本与对象顶端对齐
middle :  CSS1 将支持 valign 特性的对象的内容与对象中部对齐
bottom :  CSS1 将支持 valign 特性的对象的内容与对象底端对齐
text-bottom :  CSS1 将支持 valign 特性的对象的文本与对象顶端对齐
length :  CSS2 由浮点数字和单位标识符组成的长度值 | 百分数。可为负数。定义由基线算起的偏移量。基线对于数值来说为0,对于百分数来说就是0%。请参阅 长度单位 。目前IE尚未实现此参数
说明:
设置或检索对象内容的垂直对其方式。
对于 currentStyle 对象而言此属性的默认值为 auto 。对于其他对象而言是 baseline
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 verticalAlign
示例:
td { vertical-align : middle; }

==============================

语法:
word-spacing : normal | length
取值:
normal :  默认值。默认间隔
length :  由浮点数字和单位标识符组成的长度值,允许为负值。请参阅长度单位
说明:
检索或设置对象中的单词之间插入的空隔。
对于IE4+而言仅在MAC平台上可用。对于其他系统平台的支持由IE6开始。
单词间距会受对齐调整影响。
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 wordSpacing
示例:
div { word-spacing : 10; }
div { word-spacing : 10px; }

 视频下载地址
我尽快的录制

 

posted @ 2007-03-04 11:38 水源 阅读(591) | 评论 (0)编辑

文字部分:
expression web 视频教程第九节 格式菜单[3] 样式

级联样式 在演示文件cssdemo里面有具体的说明

 

CSS教学『选择器运用』

 

基础中我们有提到何谓选择器,例如:table{font-size:9pt}里面的table就称为选择器,就是选用table(表格)在{}里定义样式,这个选择器当然你可以自己设定为别的名称,让网页指定的地方来使用,或者你想每行用不同的文字颜色或不同的表格颜色,没问题,用自定义选择器一定让你更容易掌握。

  

种类一:CLASS="名称"
■选择器文字运用范例1:看范例效果 

<style type=text/css>
<!--
.123{
color : #cc6699 ; /*文字色彩*/
font-size : 9pt /*文字大小*/
}

.456{
color : #336699 ; /*文字色彩*/
letter-spacing : 3pt;/*字距*/
font-size : 9pt /*文字大小*/
}

-->
</style>
</head><body>
□<p class="123">这里的文字是粉色,9pt的大小</p>
□<p class="456">这里的文字是蓝色,9pt字的距离4pt的大小</p>

  

■选择器窗体、表格运用范例2:看范例效果

<style type=text/css>
<!--
.789{
background-color: #edcbdc;/*背景色彩*/
color : #ffffff ; /*文字色彩*/
font-size : 9pt ;/*文字大小*/
border: 1px solid #cc6699 ;/*框线大小及色彩*/
}

.ABC{ 
background-color: #336699; /*背景色彩*/
color: #ffffff; /*文字色彩*/
font-size: 9pt; /*文字大小*/
border: 1px solid #000000;/*框线大小及色彩*/
}

-->
</style></head><body> 
<input class="789" type="text" name="T1" size="20" value="这里是窗体">
<table class="ABC" width="182"> 
<td>这里是表格</td> 
</table>

  

种类二:ID="名称"
还有一种方式就是使用ID,其实这跟上方的意思是相同的,CLASS选择器是在前方加上小数点,不同的是ID是在前方加上#,来看下面的范例:(你可以试试看是不是跟选择器文字运用范例1结果是一样的) 

<style type=text/css>
<!--
#123{
color : #cc6699 ; /*文字色彩*/
font-size : 9pt /*文字大小*/
}

#456{
color : #336699 ; /*文字色彩*/
letter-spacing : 3pt;/*字距*/
font-size : 9pt /*文字大小*/
}

-->
</style>
</head><body>
□<p ID="123">这里的文字是粉色9pt的大小</p>
□<p ID="456">这里的文字是蓝色9pt字的距离4pt的大小</p>

字体的效果

字体样式里面的个个项目:介绍

语法:
font-variant : normal | small-caps 
取值:

normal  :  默认值。正常的字体
small-caps  :  小型的大写字母字体

说明:
设置或检索对象中的文本是否为小型的大写字母。
IE4.0将此属性的
 small-caps 处理为大写字母的较小尺寸。
此属性对于
 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为
 fontVariant 

 

语法:
font-weight : normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 
取值:

normal  :  默认值。正常的字体。相当于 400 。声明此值将取消之前任何设置
bold  :  粗体。相当于 700 。也相当于 b 对象的作用
bolder  :   normal >粗
lighter  :   normal >细
100  :  字体至少像 200 那样细
200  :  字体至少像 100 那样粗,像 300 那样细
300  :  字体至少像 200 那样粗,像 400 那样细
400  :  相当于 normal 
500  :  字体至少像 400 那样粗,像 600 那样细
600  :  字体至少像 500 那样粗,像 700 那样细
700  :  相当于 bold 
800  :  字体至少像 700 那样粗,像 900 那样细
900  :  字体至少像 800 那样粗

说明:
设置或检索对象中的文本字体的粗细。
作用由用户端系统安装的字体的特定字体变量映射决定。系统选择最近的匹配。也就是说,用户可能
看不到不同值之间的差异。
IE4.0仅仅支持
 normal  bold 值。
此属性对于
 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为
 fontWeight 。 

==================

text-decoration : none || underline || blink || overline || line-through 
取值:

none  :  默认值。无装饰
blink  :  闪烁
underline  :  下划线
line-through  :  贯穿线
overline  :  上划线

text-transform : none | capitalize | uppercase | lowercase 
取值:

none  :  默认值。无转换发生
capitalize  :  将每个单词的第一个字母转换成大写,其余无转换发生
uppercase  :  转换成大写
lowercase  :  转换成小写
基于 ID 的样式旁将显示红点。 
演示
基于类的样式旁将显示绿点。
基于元素的样式旁将显示蓝点。 演示 

dsfsdfsdfsdfsdsfdsdsdfdsdf 所有的p标签都是带下划线

级联样式旁将显示黄点。看代码里面效果
  在各种颜色的点周围将显示一个圈以标记当前网页中所使用的样式。
  导入的外部级联样式表旁将显示 @ 符号。

下载地址

发布网站 http://www.sr521.com  http://hi.baidu.com/sr521

td {
 border: thick ridge #00FF00;
}
expression web 视频教程第九节 格式菜单[3] 样式
大家好,由于样式的内容很多 我尽量给大家多讲些
1级联样式 在演示文件cssdemo里面有具体的说明 看操作
为了节省时间 我就让大家直接看例子。
这个样式使用了字体的所有参数
我给大家一一解释
1是字体类型 如宋体等
2字体大小
3看见效果吧 字体的磅值
4字体样式
看演示 我就不打字了
我给大家解释一些其他的参数
这些基本上是字体的所有属性
下一次 我给大家介绍 其他的属性
谢谢大家支持 多提

posted @ 2007-03-02 10:23 水源 阅读(382) | 评论 (0)编辑