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

Restlet实战(十六)结合源代码分析及使用Filter

    博客分类:
  • REST
阅读更多

其实在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"/> 

 

这样,如果安全验证通过以后,过滤器就会生效。

 

 

 

 

分享到:
评论
3 楼 cocca883 2012-11-17  
首先谢谢了!
但有个问题:
<property name="next" ref="restRoute"/>  这一句的意思是什么,是干什么用的?   ref="restRoute"是固定这样写的吗?

  
2 楼 junjieshow 2010-05-12  
if (ip is invalid) {   
              response.setStatus(Status.CONNECTOR_ERROR_CONNECTION);    
            }  

if (ip is invalid)有这种写法吗?
1 楼 andyjackson 2010-04-16  
我想请问一下 如果我不想结合spring 那么怎么给加filter

相关推荐

    restlet2.0版本jee源代码

    9. **测试和支持(Testing and Support)**: 除了源代码,Restlet 2.0还提供了示例和测试用例,帮助开发者更好地理解和学习如何使用框架。此外,社区支持和官方文档也提供了丰富的资源。 10. **版本2.0.14**: 这个...

    restlet2.1学习笔记项目代码

    在这个"restlet2.1学习笔记项目代码"中,你可以找到如何设置Restlet组件、创建资源、定义路由、使用过滤器以及与其他服务通信的实际示例。通过阅读和运行这些代码,你可以深入理解Restlet的工作原理,并将其应用到...

    restlet源代码

    restlet源代码,描述了restlet框架中每个类的具体实现

    Restlet实战(二十六)事务 (Transaction)

    本文将深入探讨RESTful服务中的事务处理,并以《Restlet实战(二十六)事务 (Transaction)》为例进行解析。 首先,我们要理解RESTful服务中的核心原则之一是无状态(Stateless)。这意味着每个客户端请求都包含处理...

    restlet

    文件列表中的"RESTlet"可能是RESTlet框架的源代码、文档或示例应用。通过学习这些资料,开发者可以深入理解RESTlet的工作原理,掌握如何使用RESTlet构建RESTful服务和客户端应用,从而提升其在Web服务开发领域的专业...

    基于Spring的Restlet实例

    将Spring与Restlet结合,可以利用Spring的强大功能来构建高效、可扩展的REST服务。 标题"基于Spring的Restlet实例"意味着我们将探讨如何在Spring环境中集成和使用Restlet库来开发REST服务。这通常涉及以下几个关键...

    Restlet开发的Basic认证

    5. **示例代码**:在`authorizationControl`这个文件夹中,可能包含了实现上述功能的Java源代码示例。例如,一个名为`BasicAuthenticator`的类,它继承了`Authenticator`,并在`authenticate`方法内进行用户验证。...

    restlet代码

    restlet代码

    Restlet开发实例

    1. JAX-RS与Restlet的结合:理解如何使用Restlet实现JAX-RS规范,创建REST服务。 2. Restlet Component和Application:了解这两者在Restlet架构中的角色,以及如何使用它们来组织和扩展REST服务。 3. Spring与...

    restlet处理各种请求方式参考示例

    通过阅读源代码,你可以学习到如何配置Restlet应用,创建资源,以及如何处理不同类型的HTTP请求。此外,示例可能还会涵盖错误处理、日志记录、性能优化等方面的内容。 总之,Restlet是一个强大的工具,可以帮助...

    Restlet所需要的所有jar包

    Restlet是一款开源的Java框架,专门用于构建RESTful(Representational State Transfer)Web服务。REST是一种轻量级的架构风格,常用于构建高效、可扩展的网络应用程序。本压缩包包含Restlet框架运行所需的全部jar...

    RestletClient接口调试

    RestletClient允许你以文本、源代码或文件形式输入这些数据。 3. **发送请求**:完成配置后,点击“发送”按钮,RestletClient将执行请求,并显示服务器的响应。这包括状态码(如200表示成功,404表示未找到),...

    Restlet与Spring 集成

    Restlet与Spring集成是将Restlet框架与Spring框架结合,以增强RESTful服务的开发能力。Restlet是一个轻量级的Java框架,专门用于构建REST(Representational State Transfer)架构风格的应用程序。它遵循JAX-RS...

    restlet-j2ee-2.0.15.rar

    这个压缩包可能包含了该版本的源代码、JAR文件、文档、示例以及相关的配置文件,供开发者在J2EE环境下集成和使用。 描述中提到,Restlet是对 HttpClient 的一个简单封装。HttpClient是Apache基金会的一个开源项目,...

    RESTLET框架学习书籍

    - **语义网的整合**:探讨如何将Restlet与语义网结合,提高应用的数据处理能力。 #### 四、实践操作 - **第一章:反思Web开发**: - 学习REST架构的基本原理。 - 了解RESTLET框架的历史背景和发展现状。 - 实践...

    Restlet Client-2.13.2

    Restlet Client插件是一款运行在chrome内核浏览器上的Web服务测试插件,该插件主要用于测试各种Web服务,能查看网站基本信息、浏览网页代码并能发送HTTP请求来测试网站Web服务,同时支持自动化API场景。用户在安装了...

    RESTLET开发

    RESTLET框架和JAX-RS API的结合使用大大简化了RESTful服务的开发过程,使得开发者能够更专注于业务逻辑而不是底层的技术细节。此外,RESTLET框架的灵活性还允许开发者轻松地扩展服务的功能,比如支持更多的数据格式...

    Restlet in action 中文

    【Restlet in Action 中文】这本书是一本针对Java开发者介绍Restlet框架的实战指南,旨在帮助读者更好地理解和使用RESTful Web API。Restlet是一个开源的Web框架,它以面向对象的方式提供了一系列类和示例,使得...

    restlet-jse-2.2.1.zip

    6. **源代码**:如果包含源码,开发者可以深入理解Restlet的工作原理,甚至可以根据需要进行定制和扩展。 使用Restlet JSE 2.2.1,开发者可以轻松地: - 定义资源(Resource):资源是REST架构中的核心概念,代表...

    restlet-jse

    "Restlet-JSE"是一个基于Java的开源框架,专门用于构建RESTful(Representational State Transfer)Web...结合提供的博客链接和压缩包内容,读者可以全面地掌握Restlet-JSE的使用和实现细节,进一步提升自己的技能。

Global site tag (gtag.js) - Google Analytics