互动出版网 专业图书网上第一专营店 独家提供样章 第3章 DWR高级主题 在 上一章中,我们第一次讨论DwR,了解了如何在应用程序中配置DWR,如何与客户 端和服务器端的DWR交互,以及日常使用的一些基本知识。在本章中,我们将进一步 深入了解、学习DWR所提供的“高级”主题。对“高级”使用引号的原因是,严格说来,本章 内容并不比前面所讨论的内容更复杂,只是不常用罢了。在本章中,我们将讨论安全性、错误处 理、访问其他URL、反向Aax、与其他框架集成,以及DWR中的Java5注解支持。 3.1DWR安全机制 这是一个众所周知的事实,当自己的Web应用程序在因特网上露面时,各种形式的不友好行 动就会立即靠拢过来。有大批黑客已经准备好攻击你的应用程序。这些人这样做的目的不外乎盗 窃金钱、获取你的资产、破坏你的声誉、让应用程序变慢等。如果放任这种行为,他们会占有你 的网站,把它变成进一步犯罪的工具,就好像僵尸攻击那些频临灭绝的特殊鸟种,只有神圣的 DMCA才能保护它们。这个场景就像“ Weird A1”歌曲中所唱的那样。 (有时候,别人会认为我喜欢夸大事实!) 从某种角度来说,这可能有点滑稽。但是,要注意非常关键的一点,在任何Web开发项目中, 安全性都是非常重要的考虑因素。在Ajax世界如此,在DWR世界也是如此! 但是,坦白地讲,很多其他Ajax工具对安全性考虑不够,让你直面安全威胁(如图3-1所示)。 DwWR提供一些安全机制,你也许会发现它非常适合自己的需求 DWR使用多层安全保障方法,但是,至少有一个机制必须始终启用。下面我们首先讨论这 种机制 DMCA是《数字千年版权法案》的缩写词,是美国的一部法律,约束非法制造软件的人和行为,比如制造软件或 者设备以实现非法访问控制(经常被称为DRM,即数字版权管理)。这部法律也规定了对在 Internet上违反版权行为 的处罚。DMCA是人类历史上最受争议的法案之一,因为很多人认为这个法案涉及面太广、不公平(例如,由于版 权所有者从网站删除内容非常容易,因此侵权的事件在很多时候也存在法律疑问)。有些人甚至认为,这本身就是 不合法的标准。不幸的是,到目前为止,在法庭上尚未出现成功申辩的案例 在2006年专辑 Straight Outta Lynwood中,“ Weird A” Yankovic发布了一首新歌“ Virus alert'”。这首歌说明如何在自 己的计算机上检测病毒,并消除它。如果你想了解这首歌,可以访问www.answers.com/topic/virus-alert
DWR高级主题 第3章 上一章中,我们第一次讨论DWR,了解了如何在应用程序中配置DWR,如何与客户 端和服务器端的DWR交互,以及日常使用的一些基本知识。在本章中,我们将进一步 深入了解、学习DWR所提供的“高级”主题。对“高级”使用引号的原因是,严格说来,本章 内容并不比前面所讨论的内容更复杂,只是不常用罢了。在本章中,我们将讨论安全性、错误处 理、访问其他URL、反向Ajax、与其他框架集成,以及DWR中的Java 5注解支持。 在 3.1 DWR 安全机制 这是一个众所周知的事实,当自己的Web应用程序在因特网上露面时,各种形式的不友好行 动就会立即靠拢过来。有大批黑客已经准备好攻击你的应用程序。这些人这样做的目的不外乎盗 窃金钱、获取你的资产、破坏你的声誉、让应用程序变慢等。如果放任这种行为,他们会占有你 的网站,把它变成进一步犯罪的工具,就好像僵尸攻击那些频临灭绝的特殊鸟种,只有神圣的 DMCA①才能保护它们。这个场景就像“Weird A1”②歌曲中所唱的那样。 (有时候,别人会认为我喜欢夸大事实!) 从某种角度来说,这可能有点滑稽。但是,要注意非常关键的一点,在任何Web开发项目中, 安全性都是非常重要的考虑因素。在Ajax世界如此,在DWR世界也是如此! 但是,坦白地讲,很多其他Ajax工具对安全性考虑不够,让你直面安全威胁(如图3-1所示)。 DWR提供一些安全机制,你也许会发现它非常适合自己的需求。 DWR使用多层安全保障方法,但是,至少有一个机制必须始终启用。下面我们首先讨论这 种机制。 ① DMCA是《数字千年版权法案》的缩写词,是美国的一部法律,约束非法制造软件的人和行为,比如制造软件或 者设备以实现非法访问控制(经常被称为DRM,即数字版权管理)。这部法律也规定了对在Internet上违反版权行为 的处罚。DMCA是人类历史上最受争议的法案之一,因为很多人认为这个法案涉及面太广、不公平(例如,由于版 权所有者从网站删除内容非常容易,因此侵权的事件在很多时候也存在法律疑问)。有些人甚至认为,这本身就是 不合法的标准。不幸的是,到目前为止,在法庭上尚未出现成功申辩的案例。 ② 在2006年专辑Straight Outta Lynwood中,“Weird A1”Yankovic发布了一首新歌“Virus Alert”。这首歌说明如何在自 己的计算机上检测病毒,并消除它。如果你想了解这首歌,可以访问www.answers.com/ topic/ virus-alert
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 3.1DWR安全机制80 图3-1尽管安全威胁不像有些电影中展示的那么可怕,但是 在现实世界中所带来的危害有时也是极其严重的 3.1.1默认拒绝 无须做任何设置,DWR会自动采用“默认拒绝”方法。这意味着,在默认情况下,DWR不 允许任何类被远程访问。回想一下希望远程访问的每个类,必须在配置文件中添加< create>元 素。好像仅仅这样做还不够,这个< create>元素还应该被嵌套在<a11ow>元素中。通过添加这 种信息条目,可以告诉DWR,指定类的远程调用被授权了。但是,如果没有在这个配置文件中 添加相应的信息条目,则远程调用会被禁止 聪明的读者肯定会认识到,这种措施实际上还存在一个潜在的安全漏洞:在默认情况下,被 授权类的所有方法都可以通过远程调用来访问。在通常情况下,这样做就可以了,因为我们平常 的代码组织习惯是一个类始终包含可以远程调用的所有“安全”方法。设计这样一个类可能并不 难,类中部分方法可以安全地远程调用,部分方法不允许远程调用。当然,也有人为这种做法辩 护,他们认为在这种情况下,DWR会提供更好的配置灵活性。 下面考虑代码清单3-1中的配置。 代码清单3-1范例文件dwr,xm1的配置
3.1 DWR 安全机制 80 图3-1 尽管安全威胁不像有些电影中展示的那么可怕,但是 在现实世界中所带来的危害有时也是极其严重的 3.1.1 默认拒绝 无须做任何设置,DWR会自动采用“默认拒绝”方法。这意味着,在默认情况下,DWR不 允许任何类被远程访问。回想一下希望远程访问的每个类,必须在配置文件中添加<create>元 素。好像仅仅这样做还不够,这个<create>元素还应该被嵌套在<allow>元素中。通过添加这 种信息条目,可以告诉DWR,指定类的远程调用被授权了。但是,如果没有在这个配置文件中 添加相应的信息条目,则远程调用会被禁止。 聪明的读者肯定会认识到,这种措施实际上还存在一个潜在的安全漏洞:在默认情况下,被 授权类的所有方法都可以通过远程调用来访问。在通常情况下,这样做就可以了,因为我们平常 的代码组织习惯是一个类始终包含可以远程调用的所有“安全”方法。设计这样一个类可能并不 难,类中部分方法可以安全地远程调用,部分方法不允许远程调用。当然,也有人为这种做法辩 护,他们认为在这种情况下,DWR会提供更好的配置灵活性。 下面考虑代码清单3-1中的配置。 代码清单3-1 范例文件dwr.xml的配置
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 3.1DWR安全机制81 =1.encoding="UTF-8?> <IDOCTYPE dwr PUBLIC-//GetAhead Limited//DTD Direct Web Remoting 2O//EN http://getahead,org/dwr/dwr20.dtd"> <dwr reate creator="new"javascript="MathDelegate"> aram name="class"value="app. MathDelegate"/> /allow> </dwr> 这个dwr.xm文件取自于本书第2章的 firstdwr范例程序。在这种情况下,我们希望 MathDelegate类的所有方法都可以远程调用。但是,为了演示需要,假设不希望远程调用 divide()方法。我们可以简单地添加一个< exclude>元素,在上一章已经简单说明过这个元素。 现在,存在一个< exclude>元素和一个< create>元素的子元素<inc1ude>元素。这两个元素是 互斥的,也就是说,可以使用< include>元素来指定能够远程调用的方法列表(没有列出来的方 法都是不可以远程调用的),或者使用< exclude>元素来指定不允许远程调用的方法列表(没有 列出来的任何方法都是可以访问的)。在代码清单3-2中,可以看到更新后的dwx.xm1文件,已经 排除了 divide()方法。 代码清单3-2排除 divide()方法的dwr,xm1配置 <?xml version=1.0 encoding=UTF-8>> < DOCTYPE dwr PUBLIC " -//GetAhead Limited//DTD Direct Web Remoting 2.0//EN http://get dwr> <allow> <create creator="new"javascript="MathDelegate"> param name="class"value="app. MathDelegate"/> exclude method= divide"/ reate </dwr> < include>和< exclude>元素都接收一个以逗号分隔的列表作为 method的属性值,这样可以按 照自己的需求指定任意多个方法。 请注意,DWR从来不允许自己的内部类被远程访问,因此可以降低攻击者破坏DWR内部机
3.1 DWR 安全机制 81 这个dwr.xml文件取自于本书第2章的firstdwr范例程序。在这种情况下,我们希望 MathDelegate类的所有方法都可以远程调用。但是,为了演示需要,假设不希望远程调用 divide()方法。我们可以简单地添加一个<exclude>元素,在上一章已经简单说明过这个元素。 现在,存在一个<exclude>元素和一个<create>元素的子元素<include>元素。这两个元素是 互斥的,也就是说,可以使用<include>元素来指定能够远程调用的方法列表(没有列出来的方 法都是不可以远程调用的),或者使用<exclude>元素来指定不允许远程调用的方法列表(没有 列出来的任何方法都是可以访问的)。在代码清单3-2中,可以看到更新后的dwr.xml文件,已经 排除了divide()方法。 代码清单3-2 排除divide()方法的dwr.xml配置 <include>和<exclude>元素都接收一个以逗号分隔的列表作为method的属性值,这样可以按 照自己的需求指定任意多个方法。 请注意,DWR从来不允许自己的内部类被远程访问,因此可以降低攻击者破坏DWR内部机
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 3.1DWR安全机制8 制的概率,进一步增强应用程序的安全性 1.2J2EE安全性和DWR 如果执著地希望进一步加强web应用程序的安全性,可以采取其他措施把JEE安全性和 DwR集成到一起。借助于这种能力,可以指定只有特定的安全角色才能访问特定的远程类,或 者特定角色可以访问某远程对象的特定方法 什么是J2EE安全性 通常,术语]E安全性指的是EE平台和实现平台的容器等提供的安全模型。这种机制 定义角色,然后每个用户会分配指定角色。资源是“受限的”,因为只有特定角色,也就是特 定用户才可以访问。这种机制是由容器而不是应用程序代码管理的,这样就免除了自己编写所 有的安全代码。自己编写的安全代码其实很难保证安全性,也难以审计。安全控制能力都是采 用声明的形式,这意味着只需要在配置文件中创建合适的信息条目(或者创建合适的文件,根 据容器不同可能有差异)。尽管存在与这种机制相关的编程方式,但通常并不要求它们真正实 现安全性,仅仅去提升应用程序的能力而已。 保护 DWRServlet 第一个需要注意的事情是,使用基于]2EE角色的安全机制,保证 DWRServ1et自身的安全性。 为实现这一点,我们必须引入其他配置选项:多个dwr.xm1文件。 回想一下,在dwr.xm1文件中,代码可能类似于: <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>ukItd getahead dwr. DWRServlet</servlet-class> </servlet> 你是否注意到没有指定dwx,xm1文件呢?这是因为,在默认情况下,DWR会在Web应用程序 的WEB-INF日录中查找一个名为dwr.xm1的文件,所以不必再实施任何其他修改。但是,如果希 望在其他地方放置这个配置文件,需要向 serve添加一个init参数,类似于: <init-param> param-name>config</param-name> <param-value>configFiles/dwrConfig xml</param-value> </init-param> 现在,DWR会加载 configFiles目录(相对于Web应用程序的根目录)中的文件 dwrconfig.xm1。 另一个方便的技巧是,你可以指定多个配置文件。为实现这一点,只需要添加多个init参 数,参数名称的格式为 configXXXX,其中XXXX可以是任何内容。每个init参数的名称必须是 不同的,使用XXXX的目的仅仅是保证唯一性。例如,可以设置如下参数
3.1 DWR 安全机制 82 制的概率,进一步增强应用程序的安全性。 3.1.2 J2EE 安全性和 DWR 如果执著地希望进一步加强Web应用程序的安全性,可以采取其他措施把J2EE安全性和 DWR集成到一起。借助于这种能力,可以指定只有特定的安全角色才能访问特定的远程类,或 者特定角色可以访问某远程对象的特定方法。 什么是J2EE安全性 通常,术语J2EE安全性指的是J2EE平台和实现平台的容器等提供的安全模型。这种机制 定义角色,然后每个用户会分配指定角色。资源是“受限的”,因为只有特定角色,也就是特 定用户才可以访问。这种机制是由容器而不是应用程序代码管理的,这样就免除了自己编写所 有的安全代码。自己编写的安全代码其实很难保证安全性,也难以审计。安全控制能力都是采 用声明的形式,这意味着只需要在配置文件中创建合适的信息条目(或者创建合适的文件,根 据容器不同可能有差异)。尽管存在与这种机制相关的编程方式,但通常并不要求它们真正实 现安全性,仅仅去提升应用程序的能力而已。 1. 保护DWRServlet 第一个需要注意的事情是,使用基于J2EE角色的安全机制,保证DWRServlet自身的安全性。 为实现这一点,我们必须引入其他配置选项:多个dwr.xml文件。 回想一下,在dwr.xml文件中,代码可能类似于: 你是否注意到没有指定dwr.xml文件呢?这是因为,在默认情况下,DWR会在Web应用程序 的WEB-INF目录中查找一个名为dwr.xml的文件,所以不必再实施任何其他修改。但是,如果希 望在其他地方放置这个配置文件,需要向servlet添加一个init参数,类似于: 现在,DWR会加载configFiles目录(相对于Web应用程序的根目录)中的文件 dwrConfig.xml。 另一个方便的技巧是,你可以指定多个配置文件。为实现这一点,只需要添加多个init参 数,参数名称的格式为configXXXX,其中XXXX可以是任何内容。每个init参数的名称必须是 不同的,使用XXXX的目的仅仅是保证唯一性。例如,可以设置如下参数:
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 3.1DWR安全机制83 <servlet> <servlet-name>dwr-invoker/servlet vlet-classuk ltd getah rvlet/servlet-class> <init-param <param-name>config1234</param-name> <param-value>configFiles/dwrConfig1234 xml</param-value> </init-param> init-param param-name>config5678</param-name> <param-valueconfigfiles/dwr Config5678 xml</param-value> </init-param> 这也是一个非常方便的技巧,因为使用它可以把自己的配置组织为逻辑组,例如,每个包或 者其他结构分别使用一个配置文件。DWR会加载所有的配置文件,并把这些配置文件合并为 个主配置—不需要自己做任何其他配置! 如何把这些集成到安全性方面呢?你还需要做的事情是定义 DWRSery1et的多个实例 下所示 <servlet-name>dwr-user-invoker</servlet-name> <servlet-class>ukItd getahead dwr. DWRServlet</servlet-class> <param-name>config-user</param-name> <param-value>wEB-INF/dwr-user xml</p /init-param> </servlet <servlet <servlet-class>ukltd getahead dwr. DWRServlet</servlet-class> <init-param <param-name>config-admin</param-name> <param-value>wE B-INF/dwI-admin xml</param-value> /init-param> </servlet> <servlet-mapping <servlet-name>dwr-admin ker</servlet-name> <url-pattern>/dwradmin/*</url-pattern <servlet-mapping> <servlet-name>dwr-user-invoker</servlet-name> <url-pattern>/dwruser/*</url-pattern> </servlet-mapping> 目前实际上存在两类用户:一般用户和管理用户。每类用户拥有不同的配置文件,而且更重 要的是,每类用户使用不同的URL映射。这样做很重要,原因是可以充分利用J2EE安全机制,以 根据角色来保护 servlet。例如
3.1 DWR 安全机制 83 这也是一个非常方便的技巧,因为使用它可以把自己的配置组织为逻辑组,例如,每个包或 者其他结构分别使用一个配置文件。DWR会加载所有的配置文件,并把这些配置文件合并为一 个主配置——不需要自己做任何其他配置! 如何把这些集成到安全性方面呢?你还需要做的事情是定义DWRServlet的多个实例,如 下所示: 目前实际上存在两类用户:一般用户和管理用户。每类用户拥有不同的配置文件,而且更重 要的是,每类用户使用不同的URL映射。这样做很重要,原因是可以充分利用J2EE安全机制,以 根据角色来保护servlet。例如: