`
495081611
  • 浏览: 33146 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Struts2的REST插件

阅读更多
注意:本插件仅适用于Struts 2.1.1或更高的版本。

特性
用法
2.1 定制ContentTypeHandlers
2.2 关于struts.xml

示例
配置
安装
资源
 
此REST插件简化了人们和电脑客户端对REST风格资源的访问。其目标是100%实现和Ruby on Rails REST URL风格相兼容的,并且可以免除使用XML作为资源的开发模式。它基于Convention Plugin来支持对action和result的自动配置。

此Rest风格的action映射强制兼容Ruby-On-Rails的风格映射。如果方法未被指定(通过“!”或者“method:”前缀),那么将基于ReST风格的约定(通过检查URL和HTTP方法)进行猜测。这里特别说明的是,此插件和codebehind plugin一起也可以正常工作,因此,不再需要使用基于XML的配置文件。

此映射支持如下参数:

struts.mapper.idParameterName - 如果设置,则它的值将被作为保存id的参数名,然后id将被从action名称中移除。不管是否指定了相关方法,此映射都会试图从url中移除标识符并将它作为一个参数保存。
struts.mapper.indexMethodName - 在没有id参数的情况下,通过GET请求调用的方法名。默认为index。
struts.mapper.getMethodName - 在具有id参数的情况下,通过GET请求调用的方法名。默认为show。
struts.mapper.postMethodName - 在没有id参数的情况下,通过POST请求调用的方法名。默认为create。
struts.mapper.putMethodName - 在具有id参数的情况下,通过PUT请求调用的方法名。默认为update。
struts.mapper.deleteMethodName - 在具有id参数的情况下,通过DELETE请求调用的方法名。默认为destory。
struts.mapper.editMethodName - 在具有id参数且指定了“edit”视图的情况下,通过GET请求调用的方法名。默认为edit。
struts.mapper.newMethodName - 在没有id参数且指定了“new”视图的情况下,通过GET请求调用的方法名。默认为editNew。


下列URL将调用Action的相关方法如下:

GET: /movies => method="index"
GET: /movies/Thrillers => method="show", id="Thrillers"
GET: /movies/Thrillers;edit => method="edit", id="Thrillers"
GET: /movies/Thrillers/edit => method="edit", id="Thrillers"
GET: /movies/new => method="editNew"
POST: /movies => method="create"
PUT: /movies/Thrillers => method="update", id="Thrillers"
DELETE: /movies/Thrillers => method="destroy", id="Thrillers"
为了模拟HTTP方法的PUT和DELETE请求,因为HTML并不支持,我们将使用一个叫做“_method”的HTTP参数。

或者,使用下表的表示方式:

HTTP method  URI  Class.method  parameters 
GET  /movie  Movie.index   
POST  /movie  Movie.create   
PUT  /movie/Thrillers  Movie.update  id="Thrillers" 
DELETE  /movie/Thrillers  Movie.destroy  id="Thrillers" 
GET  /movie/Thrillers  Movie.show  id="Thrillers" 
GET  /movie/Thrillers/edit  Movie.edit  id="Thrillers" 
GET  /movie/new  Movie.editNew   

除了作为一个REST风格的URL映射器以外,此插件还对于multiple content types、通过URL扩展名的可切换性提供了内建的支持。这样,一个单一的资源就能够被作为一个multiple content types暴露出去,而不需要其他额外的工作。

例如,通过暴露一个“orders”资源,客户端可以立即通过如下方式进行访问:

http://my.company.com/myapp/orders/1
http://my.company.com/myapp/orders/1.xml
http://my.company.com/myapp/orders/1.xhtml
http://my.company.com/myapp/orders/1.json

此REST插件自动处理序列号和反序列化以及相应的格式化。

一、特性
完全实现 Ruby on Rails 的REST风格URL
支持免XML开发,不需要注解
内建序列号和反序列化支持,以支持XML和JSON
自动错误处理
针对HTTP响应的类型安全设置
自动有条件的GET支持

二、用法
在配置的包(package)中创建以“Controller”结尾的Java对象。这里的“Controller”后缀用于区别REST action和普通的Struts2 action。尽管这完全是可选的,以及它们的功能完全相同。现在,加入方法即可处理各种请求。举例说明,下面的资源action将支持使用GET和PUT请求访问/orders/34资源:

package org.apache.struts2.rest.example;

public class OrdersController implements ModelDriven {

    private OrderManager orderManager;
    private String id;
    private Order model;

    // Handles /orders/{id} GET requests
    public HttpHeaders show() {
        model = orderManager.findOrder(id);
        return new DefaultHttpHeaders("show")
            .withETag(model.getUniqueStamp())
            .lastModified(model.getLastModified());
    }

    // Handles /orders/{id} PUT requests
    public String update() {
        orderManager.updateOrder(model);
        return "update";
    }

    // getters and setters
}

在这个例子中,使用了ModelDriven 接口,来确保只有模型——这里的Order对象,被返回给客户端。否则,OrdersController 对象将被整个序列化。

你也许在想为什么show()方法返回了一个HttpHeaders 对象,而update()方法返回了预期的结果代码字符串。REST插件添加了对action方法的支持,对于那些通过响应有更多控制的action,返回HttpHeaders 对象是一种方式。在本例中,我们想要确保响应包括ETag 头和一个最近修改日期,以便信息可以被客户端正确的缓存。HttpHeaders 对象是一个方便的方式,可以在保证在类型安全的情况下控制响应。

而且,请注意,我们没有在上述任何一个方法中,返回通常的“success”结果码。这允许我们使用Codebehind Plugin插件的特性,当访问扩展名为.xhtml的资源时,以更加直观的方式来选择结果模板去处理。在本例中,我们可以通过为相应的方法创建/orders-show.jsp 和/orders-update.jsp页面,来提供一个定制化的XHTML 资源视图。

2.1 定制ContentTypeHandlers
如果你需要处理不被默认处理器支持的扩展名时,你可以创建你自己的ContentTypeHandler 实现,并在struts.xml中进行定义即可。

<bean name="yaml" type="org.apache.struts2.rest.handler.ContentTypeHandler" class="com.mycompany.MyYamlContentHandler" />
如果内建的内容类型处理器无法满足你的需要,那么你可以提供另一个处理器,覆盖对任何扩展名的默认处理方式,并使用它自己的别名进行声明,例如:

<bean name="myXml" type="org.apache.struts2.rest.handler.ContentTypeHandler" class="com.mycompany.MyXmlContentHandler" />

然后,只需要告知REST插件使用你自己的处理器,去覆盖特定扩展的处理器即可。在struts.properties文件中,可以做如下配置:

struts.rest.handlerOverride.xml=myXml

2.2 关于struts.xml
配置Struts以使用REST action映射器:

<constant name="struts.mapper.class" value="rest" />
因为REST插件使用Convention plugin,需要在Struts.xml中进行相关设置:

<constant name="struts.convention.action.suffix" value="Controller"/>
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<constant name="struts.convention.default.parent.package" value="rest-default"/>
对于上述例子而言,package设置如下:

<constant name="struts.convention.package.locators" value="example"/>


三、示例
此插件是随struts2-rest-showcase 应用程序一起发布的,用以演示一个简单的REST web应用程序。

该示例和不同于一般,控制器将被映射到一个关联的HTTP(PUT,DELETE)方法。

看下图可以让你更容易的理解REST的工作方式:



四、配置
配置可以定制,具体可以查看开发指南文档。要获得更多的配置项信息,可以查看Convention Plugin的文档。

设置 描述 默认 可能值
struts.rest.handlerOverride.EXTENSION  处理EXTENSION 值的ContentTypeHandler 实现的别名 N/A  任何声明了的ContentTypeHandler实现的别名
struts.rest.defaultExtension  当没有在request中显示指定的时候默认使用扩展类型 xml  任意扩展名
struts.rest.validationFailureStatusCode  校验失败后返回的HTTP状态码  400  任意HTTP的数字状态码

五、安装
复制插件的jar包到应用程序的/WEB-INF/lib 即可。此插件依赖于Convention Plugin,因此,如果没有类似于Maven2那样的支持传递依赖的构建系统的话,你可能也需要加入Convention Plugin的jar包。

六、资源
http://www.b-simple.de/documents - 精短的RESTful Rails 教程(PDF格式, 有多种语言)
RESTful Web Services - 来自 O'Reilly 的一本书
Go Light with Apache Struts 2 and REST - Don Brown 在 ApacheCon US 2008 年会上的幻灯片简报



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/abigfrog/archive/2009/11/10/4793039.aspx
分享到:
评论

相关推荐

    struts2-restDmo,struts2下的rest插件小例子

    而Struts2的REST插件则是为了让开发者能够轻松地在Struts2应用中实现RESTful服务。REST(Representational State Transfer)是一种软件架构风格,常用于设计网络应用程序,特别是Web服务。RESTful服务遵循一组特定的...

    Struts2-rest插件(有注释)

    以 Convention 插件为基础,Struts 2.1 又新增了 REST 插件,允许 Struts 2 应用对外提供 REST 服务。REST 插件也无需使用 XML 进行配置管理。Struts 2.1 通过 REST 插件完全可以提供让人和机器客户端共同使用的资源...

    struts2+rest简单实例

    - **Struts2 REST插件**:这个插件使Struts2能够处理RESTful请求,解析HTTP方法和URI模板。 - **Action映射**:配置Action以响应特定的RESTful路径,例如`...

    Struts2 支持REST 代码

    1. **配置Struts2 REST插件**:首先,需要在`struts.xml`配置文件中引入REST插件。这通常涉及到添加`&lt;constant&gt;`和`&lt;package&gt;`标签,设置相关的配置项,如: ```xml &lt;constant name="struts.enable....

    struts2的rest风格插件实例

    由于 Struts 2 的 REST 插件还需要将提供 XML、JSON 格式的数据,因此还需要将 xstream-1.2.2.jar、json-lib-2.1.jar、ezmorph-1.0.3.jar 以及 Jakarta-Common 相关 JAR 包复制到 Web 应用的 WEB-INF/lib 路径下。...

    struts2_rest整合完整例子

    2. **配置Struts2**:在struts.xml配置文件中启用REST插件,并配置Action,如: ```xml &lt;constant name="struts.action.extension" value=","/&gt; &lt;package name="rest" namespace="/" extends="struts-default,...

    Struts2漏洞利用工具2017版

    S2-019,又称为“Struts2 Rest Plugin远程代码执行漏洞”,主要是由于Struts2 REST插件处理XML请求时存在的问题,使得攻击者可以通过发送精心构造的XML请求来执行任意代码。解决方法是禁用REST插件或升级Struts2到...

    struts2.1.6 convertion,rest两插件的例子

    struts2.1.6 convertion插件(即注释方式配置)的hello...rest插件例子 默认调用 create()方法 struts2.1.6 vistor校验例子 都是我测试例子,写到一块了 有点乱 哪为高手给我说下 rest-plugin有什么好处 项目中有说明文件

    【2017版】Struts2漏洞检查工具

    S2-045漏洞,全称为“Struts2 REST插件远程命令执行”,是由于Struts2 REST插件的不当处理导致的。攻击者可以通过构造特定的HTTP请求,利用该漏洞执行任意系统命令。修复此漏洞通常涉及更新Struts2框架到不受影响的...

    struts2-016/017漏洞解决

    Struts2 S2-017漏洞,也称为“Struts2 REST插件远程代码执行漏洞”,影响Struts2的2.3.5到2.3.31及2.5.0到2.5.10.1版本。此漏洞与REST插件有关,该插件使得Struts2应用程序能够处理RESTful请求。攻击者可以利用此...

    struts2漏洞利用工具

    S2-057,又名"Struts2 REST插件漏洞",是由于REST插件处理HTTP头字段时的缺陷,使得攻击者可以通过修改Content-Type字段来触发恶意代码执行。 5. **Struts2漏洞利用工具** 压缩包中的“struts2漏洞利用工具”很...

    struts 2 升级所需jar 包集合(升级到2.3.32)

    紧接着,S2-046漏洞,也被称为"Struts 2 REST插件远程代码执行漏洞",影响了Struts 2的REST插件。该漏洞允许攻击者通过精心构造的HTTP请求,绕过安全检查,执行服务器上的任意代码。这可能导致服务器被黑客控制,...

    Struts2+rest简单实例

    在这个"Struts2+rest简单实例"中,开发者创建了一个小型的示例应用,目的是帮助初学者快速理解如何在Struts2框架中集成RESTful服务。以下是这个实例中可能涉及的关键知识点: 1. **Struts2框架基础**:Struts2的...

    struts2-rest-sample:使用 struts2 讨论 rest api 实现基础的示例项目

    2. **配置Struts2**:在struts.xml配置文件中,定义REST插件并配置相关的拦截器栈。例如: ```xml &lt;constant name="struts.enable.SlashesInActionNames" value="true"/&gt; &lt;constant name="struts.mapper....

    Struts2-漏洞检查工具2018版.zip

    2. **CVE-2017-5638 (Struts2 S2-045)**:这是一个远程代码执行漏洞,影响了Struts2的Struts2 REST插件。攻击者可以通过发送恶意构造的HTTP请求,利用该漏洞执行任意代码,从而控制系统。 3. **CVE-2018-11776 ...

    使用 Struts 2 开发 RESTful 服务

    总结起来,Struts 2 通过 REST 插件和 Convention 插件,使得开发 RESTful 服务变得更加便捷。理解 REST 原则和利用 Struts 2 的相关插件,可以有效地构建可伸缩、易于维护的 Web 应用。在实践中,开发者应遵循 ...

    CVE-2017-9805-POC.py s2-052.py 批量检测脚本

    Apache Struts2的REST插件存在远程代码执行的高危漏洞,其编号为CVE-2017-9805(S2-052)。Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行...

    java Struts2中文学习文档

    Struts2社区提供了丰富的插件,如Struts2 DOJO插件支持AJAX,Struts2 JSON插件用于JSON数据交换,还有Struts2 REST插件支持RESTful服务。 九、实战案例 本学习文档包含Struts2的基础实例,如简单的Hello World程序...

    Struts2 (S2-016/S2-017)高危漏洞修复文件

    S2-016漏洞,全称为"Struts2 REST插件远程代码执行漏洞",主要影响Struts2的REST插件。该漏洞源于框架在处理XML内容时的不当输入验证。攻击者可以通过构造恶意的XML数据,使服务器执行任意代码,从而可能导致系统被...

    struts2引用库

    - Struts2支持多种插件,如Struts2 REST插件、Struts2 Junit插件等,可扩展性强。 - 可以自定义拦截器、结果类型和Action上下文,以满足特定需求。 总的来说,Struts2是一个强大的Web开发框架,它的引用库涵盖了...

Global site tag (gtag.js) - Google Analytics