其实在Web应用中Filter对大家来说一点都不陌生,比如说在我之前项目的架构中,就使用filter做过Session是否失效、设定页面字符集、设置本地化,如:
设定本地化的Filter代码:
Cookie cookie = WebUtil.getCookie(req, INFOSYSCoreStatics.LOCALE_KEY);
Locale locale = null;
if(cookie == null){
locale =request.getLocale();
}else{
new Locale(cookie.getValue(), "");
}
if (locale != null) {
WebUtil.setLocale(req, res, locale);
}
设定字符集的Filter代码:
if (encoding == null)
encoding = DEFAULT_ENCODING;
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset=" + encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
好了,不多举例了,毕竟这不是本篇文章的重点,下面我们看看在Restlet里面是如何使用Filter,当然了,这两个Filter名称一样,却不是同一个东西。
我们知道,Restlet类有个handle方法:
@Override
public void handle(Request request, Response response) {
init(request, response);
}
当Restlet类或者其子类被请求调用执行时,此方法就会被调用。Filter也是Restlet的子类,所以,上述规则同样适用于Filter。同样的,看看Filter里面的handle的方法:
@Override
public final void handle(Request request, Response response) {
super.handle(request, response);
switch (beforeHandle(request, response)) {
case CONTINUE:
switch (doHandle(request, response)) {
case CONTINUE:
afterHandle(request, response);
break;
default:
// Stop the processing
break;
}
break;
case SKIP:
afterHandle(request, response);
break;
default:
// Stop the processing
break;
}
}
这个方法里面调用了另外两个方法beforeHandle和afterHandle:
protected int beforeHandle(Request request, Response response) {
return CONTINUE;
}
protected void afterHandle(Request request, Response response) {
// To be overriden
}
代码简单清晰,简要的说明一下,handle方法里,beforeHandle首先会被执行,当然如果我们创建我们自己的Filter,会覆盖这个方法,加入一些自己的逻辑代码,比如判断当前请求的是否是正确的资源,客户端IP是否是在允许的范围内?等,如果通过校验,则会返回CONTINUE. 接下来会执行我们设定的资源类,资源类执行结束,则会执行afterHandle方法。
下面我们就给出一个例子,在Filter里检查资源是否正确以及IP是否在允许的范围内:
public class CommonFilter extends Filter {
private static String[] unprotectedResources = {"scripts", "styles",
"images", "html"};
protected void beforeHandle(Request request, Response response) {
String path = request.getResourceRef().getPath();
if (isProtectedResource(path)) {
String ip = request.getClientInfo().getAddress();
try {
//check whether the ip is allowed
if (ip is invalid) {
response.setStatus(Status.CONNECTOR_ERROR_CONNECTION);
}
}catch (Exception ex) {}
}
}
private boolean isProtectedResource(String path) {
for (int i = 0; i < unprotectedResources.length; i++) {
if (path.indexOf(unprotectedResources[i]) == 1) {
return false;
}
}
return true;
}
}
搞定Filter,那么如何使用呢?还记得我们是怎么组装Guard吗?忘记了或者没有看到之前系列的文章,可以看这里
我们首先在Spring配置文件中加入Filter的定义:
<bean id="commonFilter" class="com.mycompany.restlet.filter.CommonFilter"/>
假设,系统需要先进行安全验证,然后进行过滤,则完整配置应该是:
<bean id="component" class="org.restlet.ext.spring.SpringComponent">
<property name="defaultTarget" ref="guard" />
</bean>
<bean id="guard" class="com.mycompany.restlet.filter.CustomerGuardFilter">
<property name="next" ref="commonFilter"/>
<property name="secretResolver" ref="customerResolver"/>
</bean>
<bean id="commonFilter" class="com.mycompany.restlet.filter.CommonFilter">
<property name="next" ref="restRoute"/>
</bean>
<bean id="customerResolver" class="com.mycompany.restlet.filter.CustomerResolver"/>
这样,如果安全验证通过以后,过滤器就会生效。
分享到:
相关推荐
9. **测试和支持(Testing and Support)**: 除了源代码,Restlet 2.0还提供了示例和测试用例,帮助开发者更好地理解和学习如何使用框架。此外,社区支持和官方文档也提供了丰富的资源。 10. **版本2.0.14**: 这个...
在这个"restlet2.1学习笔记项目代码"中,你可以找到如何设置Restlet组件、创建资源、定义路由、使用过滤器以及与其他服务通信的实际示例。通过阅读和运行这些代码,你可以深入理解Restlet的工作原理,并将其应用到...
restlet源代码,描述了restlet框架中每个类的具体实现
本文将深入探讨RESTful服务中的事务处理,并以《Restlet实战(二十六)事务 (Transaction)》为例进行解析。 首先,我们要理解RESTful服务中的核心原则之一是无状态(Stateless)。这意味着每个客户端请求都包含处理...
文件列表中的"RESTlet"可能是RESTlet框架的源代码、文档或示例应用。通过学习这些资料,开发者可以深入理解RESTlet的工作原理,掌握如何使用RESTlet构建RESTful服务和客户端应用,从而提升其在Web服务开发领域的专业...
将Spring与Restlet结合,可以利用Spring的强大功能来构建高效、可扩展的REST服务。 标题"基于Spring的Restlet实例"意味着我们将探讨如何在Spring环境中集成和使用Restlet库来开发REST服务。这通常涉及以下几个关键...
5. **示例代码**:在`authorizationControl`这个文件夹中,可能包含了实现上述功能的Java源代码示例。例如,一个名为`BasicAuthenticator`的类,它继承了`Authenticator`,并在`authenticate`方法内进行用户验证。...
restlet代码
1. JAX-RS与Restlet的结合:理解如何使用Restlet实现JAX-RS规范,创建REST服务。 2. Restlet Component和Application:了解这两者在Restlet架构中的角色,以及如何使用它们来组织和扩展REST服务。 3. Spring与...
通过阅读源代码,你可以学习到如何配置Restlet应用,创建资源,以及如何处理不同类型的HTTP请求。此外,示例可能还会涵盖错误处理、日志记录、性能优化等方面的内容。 总之,Restlet是一个强大的工具,可以帮助...
Restlet是一款开源的Java框架,专门用于构建RESTful(Representational State Transfer)Web服务。REST是一种轻量级的架构风格,常用于构建高效、可扩展的网络应用程序。本压缩包包含Restlet框架运行所需的全部jar...
RestletClient允许你以文本、源代码或文件形式输入这些数据。 3. **发送请求**:完成配置后,点击“发送”按钮,RestletClient将执行请求,并显示服务器的响应。这包括状态码(如200表示成功,404表示未找到),...
Restlet与Spring集成是将Restlet框架与Spring框架结合,以增强RESTful服务的开发能力。Restlet是一个轻量级的Java框架,专门用于构建REST(Representational State Transfer)架构风格的应用程序。它遵循JAX-RS...
这个压缩包可能包含了该版本的源代码、JAR文件、文档、示例以及相关的配置文件,供开发者在J2EE环境下集成和使用。 描述中提到,Restlet是对 HttpClient 的一个简单封装。HttpClient是Apache基金会的一个开源项目,...
- **语义网的整合**:探讨如何将Restlet与语义网结合,提高应用的数据处理能力。 #### 四、实践操作 - **第一章:反思Web开发**: - 学习REST架构的基本原理。 - 了解RESTLET框架的历史背景和发展现状。 - 实践...
Restlet Client插件是一款运行在chrome内核浏览器上的Web服务测试插件,该插件主要用于测试各种Web服务,能查看网站基本信息、浏览网页代码并能发送HTTP请求来测试网站Web服务,同时支持自动化API场景。用户在安装了...
RESTLET框架和JAX-RS API的结合使用大大简化了RESTful服务的开发过程,使得开发者能够更专注于业务逻辑而不是底层的技术细节。此外,RESTLET框架的灵活性还允许开发者轻松地扩展服务的功能,比如支持更多的数据格式...
【Restlet in Action 中文】这本书是一本针对Java开发者介绍Restlet框架的实战指南,旨在帮助读者更好地理解和使用RESTful Web API。Restlet是一个开源的Web框架,它以面向对象的方式提供了一系列类和示例,使得...
6. **源代码**:如果包含源码,开发者可以深入理解Restlet的工作原理,甚至可以根据需要进行定制和扩展。 使用Restlet JSE 2.2.1,开发者可以轻松地: - 定义资源(Resource):资源是REST架构中的核心概念,代表...
"Restlet-JSE"是一个基于Java的开源框架,专门用于构建RESTful(Representational State Transfer)Web...结合提供的博客链接和压缩包内容,读者可以全面地掌握Restlet-JSE的使用和实现细节,进一步提升自己的技能。