ESI 支持 HTTP 请求变量

日期: 2003 年 11 月28 日

如何使用 ESI 标记来检索 HTTP 请求变量

完成此方法文档后,您应该能够:
  • 使用 ESI 标记来检索 HTTP 请求变量.
  • 利用提供的说明,运行示例代码来完成相同的操作.

读者应该熟悉的内容

要理解此文档,读者应该对 HTML、JSP、JavaScript 有基本的概念,并且对 ESI Specifications 1.0 有基本的了解。

引言

Edge Side Includes (ESI) 是基于 XML 的标记语言,它用来定义 web 页面组件,以在互联网边缘进行动态组装和交付。 遵从 ESI 的服务器(如 OracleAS Web Cache)缓存并组装由 ESI 标记定义的部分页面。 ESI 支持在遵从 ESI 的服务器中对一些 HTTP 标题变量进行处理。 HTTP 标题随客户端请求而来。 这些 HTTP 标题可以用作 ESI 变量,使用惯例如下。

  • "HTTP_" 是 HTTP 变量名的前缀。
  • 破折号 (-) 用下划线 (_) 代替。
  • 变量必须大写。
要引用变量,您需要在这些变量前加上前缀 $ 符号,并像 $(HTTP_VARIABLE) 这样用圆括号把变量名括起来。

例如,host 变量以 $(HTTP_HOST) 的形式进行引用,referer 变量以 $(HTTP_REFERER) 的形式进行引用。

要访问变量的子结构,需像 $(HTTP_VARIABLE{key}) 这样在变量名后添加一对大括号,其中包含可被访问的关键字。 子结构仅对某些如 $(HTTP_COOKIE{cookieName})、$(
HTTP_USER_AGENT{browser}) 之类的变量有意义。 对所有包含了逻辑键值对的变量都允许进行基于关键字的访问。 关键字是随情况变化且是可选的,如果没有指定关键字,则环境变量将返回环境碎片的全部内容。

例如,以 $(HTTP_COOKIE{cookieName}) 的形式引用 cookie 变量。 这将给出 cookie 的值,cookieName。 ESI 支持如 browserversionos 之类的虚键在 HTTP_USER_AGENT 上接收。 因此 $(
HTTP_USER_AGENT{browser})、$(HTTP_USER_AGENT{version})$(HTTP_USER_AGENT{os}) 将分别返回客户端的浏览器名称、版本和操作系统。

当关键字不存在时,逻辑 'OR'(|) 操作符可以用来为这些变量设定默认值。

例如,将 $(HTTP_VARIABLE|default) 用于普通的 HTTP 变量,
$(HTTP_VARIABLE{key} | 'default value') 形式用于具有子结构的 HTTP 变量。

说明

此示例程序有两种 web 页面,welcome.htmldisplay.jsp。 如 cookie 值和查询字符串之类的信息可以在第一个页面 welcome.html 中输入。 该页面将 cookie 值存储在名为 'cookievariable' 的 cookie 中,查询字符串被存储在名为 'query' 的变量中。 welcome.html 有一个 Submit 键,按下此键时将提交表单,并将请求发送至 display.jspdisplay.jsp 是显示存储在 HTTP 标题中的信息以及页面生成时间的动态 web 页面。

如果没有高速缓存服务器,则将为每次请求生成该页面。 但通过使用这些 ESI 标记,这些请求将在 OracleAS Web Cache 自身中得到处理。 ESI 处理器检索存储在 cookies/HTTP 标题中的用户信息,并用缓存在高速缓存服务器中的动态页面来代替它们。动态内容只被请求一次,且可由高速缓存服务器多次提供。 这可以用在动态页面中生成的时间戳记来直观表示。 在我们的示例中,我们将页面过期时间设为 60 秒,但这可以根据系统要求进行修改。 任何在过期时间之后到达的请求都将被发送至源服务器。 源服务器再次重新生成该页面,并将其缓存在 OracleAS Web Cache 中。 随后对该页面的客户端请求将从 OracleAS Web Cache 中进行处理,而不是从源服务器中进行处理。
.

让我们看一下在当前的应用程序中使用的一些代码段。 下表显示了如何使用 ESI 标记来检索 HTTP 请求变量并显示它们。 这些变量只有被包含在一些如 <esi:vars><esi:include> 等的 ESI 标记中时才会被解释。

HTTP 标题变量说明代码段
$(HTTP_COOKIE{hits}|''Cookie Does Not Exist')

该变量将显示 hits cookie 的值。 如果在请求标题中没有找到 hits cookie,那么将显示其默认值。

    <td align="left" valign="top">
    <esi:vars>$(HTTP_COOKIE{hits}|"Cookie Does Not Exist")</esi:vars>
    </td>

$(HTTP_ACCEPT_LANGUAGE{en}|'No en Language')该变量将显示客户端浏览器的语言设置的值。 如果浏览器语言被设为 en,那么请求标题将包含类似 Accept-Language:en 的表达式,因此该变量将在输出中返回 en。

    <td align="left" valign="top"> <esi:vars>$(HTTP_ACCEPT_LANGUAGE{en}|'No en Language') </esi:vars>
    </td>

$(HTTP_HOST)

HTTP_HOST 请求标题字段指定客户端请求的主机名和端口号。

    <td align="left" valign="top">
    <esi:vars>$(HTTP_HOST) </esi:vars>
    </td>

$(HTTP_REFERER)HTTP_REFERER 请求标题字段指定引用资源的 URL。

    <td align="left" valign="top"> <esi:vars>$(HTTP_REFERER) </esi:vars>
    </td>

$(HTTP_USER_AGENT{browser}) 指定客户端的浏览器类型,如 MOZILLA 或 MSIE。

    <td align="left" valign="top"> <esi:vars>$(HTTP_USER_AGENT{browser})</esi:vars>
    </td>

$(HTTP_USER_AGENT{version}|'Can Not Find The version')该变量指定客户端的浏览器版本。 如果从请求标题中找不到浏览器版本,则将显示其默认值 'Cannot Find The version'。

    <td align="left" valign="top"> <esi:vars>$(HTTP_USER_AGENT{version}|'Can Not Find The version') </esi:vars>
    </td>

$(HTTP_USER_AGENT{os}|'can Not Find The os') 显示浏览器的操作系统,如 windows/Linux。 如果在 User-Agent 请求变量中没有找到 OS 关键字,则将显示其默认值。

    <td align="left" valign="top"> <esi:vars>$(HTTP_USER_AGENT{os}|'can Not Find The os') </esi:vars>
    </td>

$(HTTP_HEADER{referer}|'referer Not Found')该变量将显示给定关键字的 HTTP 标题,因此这将显示关键字为 referrer 的 HTTP 请求标题变量的值。 如果没有找到 referer 关键字,则将显示其默认值。

    <td align="left" valign="top"> <esi:vars>$(HTTP_HEADER{referer}|'referer Not Found') </esi:vars>
    </td>

$(HTTP_HEADER{content-length}|'content-length Not Found') 该变量显示输入到 HTTP 标题中的内容长度。 如果没有指定内容长度,则将显示其默认值。

    <td align="left" valign="top"> <esi:vars>$(HTTP_HEADER{Content-length}|'content-length Not Found') </esi:vars>
    </td>

$(QUERY_STRING{query}|'Query not found')'query' 是查询字符串中的参数名称,它返回未经 URL 编码的参数值。 查询字符串可能在 URL 或请求正文中。如果在 HTTP 标题中没有找到 'query' 参数,则将显示其默认值。

    <td align="left" valign="top"> <esi:vars>$(QUERY_STRING{query}|'Query not found') </esi:vars>
    </td>

$(QUERY_STRING) 这将返回整个查询字符串。

    <td align="left" valign="top">
    <esi:vars>$(QUERY_STRING) </esi:vars>
    </td>

$(QUERY_STRING_ENCODED)这与 $(QUERY_STRING) 相同。

    <td align="left" valign="top"> <esi:vars>$(QUERY_STRING_ENCODED) </esi:vars>
    </td>

$(QUERY_STRING_DECODED{query}) 这与 $(QUERY_STRING{query}) 相同。

    <td align="left" valign="top"> <esi:vars>$(QUERY_STRING_DECODED{query}|'Query not found') </esi:vars>
    </td>

$(QUERY_STRING_ENCODED{query})该变量将返回经过 URL 编码的 'query' 参数值。 查询字符串可能在 URL 或请求正文中。

    <td align="left" valign="top"> <esi:vars>$(QUERY_STRING_ENCODED{query}|'Query not found') </esi:vars>
    </td>

ESI 支持的 HTTP 请求变量


所有在此示例程序中用到的 HTTP 请求变量的详细说明在此处
提供。

运行示例的前提条件

您将需要以下软件来运行此示例 -

  • Oracle Application Server (9.0.3 或更高版本)。可以从此处
    下载。
  • Oracle9i JDeveloper (9.0.3 或更高版本)。可以从此处下载。 这是可选的,并且仅当您希望从 JDeveloper 中进行部署时才需要。


部署示例

提供此示例的完整源代码下载

这一部分内容讨论运行示例应用程序的相关指导

第 1 步使用 Winzip 或以下命令解压缩 HttpRequestVariable.jar:

> jar -xvf HttpRequestVariable.jar

这创建了一个目录 HttpRequestVariable。

第 2 步

如果您使用的是 JDeveloper,那么按照下面的步骤做

  • 打开 Oracle9i JDeveloper,使用 'File/Open' 选项来从 HttpRequestVariable 目录中选择 HttpRequestVariable.jws。
  • 接下来,从主菜单中选择 Project/Make HttpRequestVariable.jpr。
  • 如果没有应用服务器连接,则需要创建该连接。
    • 转至 Connections -> Application Server Connection。 右键单击,然后单击 'New connection'。
    • 输入连接名称,然后选择 'Oracle9i Application Server'。
    • 输入用户名和口令
    • 输入 Enterprise Manager 的主机名、端口号和远程应用服务器主目录(仅当在远程计算机上进行部署时才需要)。
    • 单击 'Next' 和 'Test connection'。单击 Finish 按钮。
  • 现在,右键单击 HttpRequestVariable.deploy,然后选择 Deploy to <connection name>,部署到您在之前的步骤中创建的应用服务器连接上。
第 3 步利用 EM,按照以下步骤部署应用程序。
  • 转至 EM web 站点 -> 默认的 oc4j 主页。
  • 选择部署 EAR 文件
  • 输入 J2EE 应用程序名称,单击 Browse 按钮,然后从 /deploy/HttpRequestVariable.ear 中选择 HttpRequestVariable.ear。
  • 输入应用程序名为 Personalize,然后单击 Next
  • 输入 URL 映射为 /HttpRequestVariable,然后单击 Finish
  • 单击 Deploy 部署应用程序。

运行示例

在浏览器上使用以下 URL 访问页面。

http:// <host_name>: <port>/HttpRequestVariable/welcome.html。

其中,<host_name> 是安装了 OracleAS Web Cache 的计算机,<port> 是 OracleAS Web Cache 监听器运行的端口。

例如,http://incq185b.idc.oracle.com:7777/HttpRequestVariable/welcome.html。

运行示例程序的步骤:

  1. 打开浏览器。
  2. 在浏览器的地址栏中输入 URL "http:// <host_name>: <port>/HttpRequestVariable/welcome.html"。
  3. 此页面显示了一个 HTML 表单,以接收用户的 'Cookie value' 和 Query 输入。 输入一个值(例如 VIJAY)作为 'Cookie Value'。 输入 "What is your name" 作为 'Query'。 按下 Submit 键来提交表单。
  4. welcome.html 页面被提交时,显示 display.jsp。 该页面使用 ESI 标记来显示 HTTP 请求信息(如您在该页面上的访问次数、浏览器中启用的语言、主机名、浏览器名称、版本、操作系统等)以及时间戳记。
  5. 利用名称为 visits 的 cookie 来跟踪对该显示页面 (display.jsp ) 的访问次数。 每一次该页面被更新时,该 cookie 将加 1。 显示页面利用 ESI 标记在 OracleAS Web Cache 自身中进行处理,而不是在源服务器中进行处理。 这可以通过显示在显示页面中的时间戳记来直观地表示。 由于显示页面被缓存 60 秒,因此 60 秒内的所有请求都在 web 高速缓存中进行处理。 在 60 秒后,缓存的页面失效,将从源服务器中获取一个新的页面。 新的页面将在高速缓存中再驻留 60 秒。
  6. <}0要试验该示例程序,可以执行以下操作,
    i} 通过改变显示页面 URL 来编辑 'query' 参数。例如http://incq185b.idc.oracle.com:2013/HttpRequestVariable/display.jsp?query=what+is+your+age
    ii} 将另一个参数 'query1' 添加到显示页面 URL 中,例如,http://incq185b.idc.oracle.com:2013/HttpRequestVariable/display.jsp?query=what+is+your+age&query1=added+query。

    注意: 这些变量的 ESI 处理都在 OracleAS Web Cache 中进行,而不是在源服务器中。

要注意的几点

  • 变量只有被包含在 ESI 标记中时,才能得到解释。
  • 关键字用来访问所有具有子结构类型列表或目录的变量。
  • 目录关键字是大小写敏感的。
  • 除以 QUERY_STRING 开头的变量之外,从 HTTP 请求标题中得到的所有变量都有前缀 "HTTP_ "。
  • 您不能将 HTTP_HOSTHTTP_REFERER 变量设为默认值。

总结

此方法文档说明了如何使用 ESI 标记来检索 HTTP 请求变量。





请在 OTN 示例代码论坛中发表您对此示例的意见




寄送此页面
Printer View 打印机视图