`
wyuxiao729
  • 浏览: 34433 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

osgi实战项目(osmp)一步一步玩转osgi之拦截器(8)

    博客分类:
  • osgi
阅读更多

在osmp里,osmp-http对外发布了统一的访问接口,接受请求解析后从osmp-service容器里获取服务,调用并将结果返回,在这个过程中,我们通过编写自定义的拦截器对请求进行拦截,主要应用以下场景 (安全、权限、数据过滤、数据格式化、记录入参、出参日志、调用统计分析、全链路日志等AOP形为)。

下面我们介绍怎样在osmp框架下编写我们的第一个拦截器对非法IP的请求进行拦截。

 

1、参照前面讲的第一个服务的开发,搭建组件开发环境,把没有的类和包删除。

2、新增拦截器实现类OsmpDemoInterceptor.java

 

/*   
 * Project: 基础组件 
 * FileName: SicentTestServiceImpl.java
 * Company: Chengdu Sicent Technology Co.,Ltd
 * version: V1.0
 */
package com.osmp.demo.interceptor;

import org.springframework.stereotype.Component;

import com.osmp.intf.define.config.FrameConst;
import com.osmp.intf.define.interceptor.ServiceInterceptor;
import com.osmp.intf.define.interceptor.ServiceInvocation;
import com.osmp.intf.define.model.ServiceContext;


/**
 * Description:日志拦截用于统计日志访问提供支撑数据
 * 
 * @author: wangkaiping
 * @date: 2014年9月26日 下午3:03:55
 */
@Component
public class OsmpDemoInterceptor implements ServiceInterceptor {


	@Override
	public Object invock(ServiceInvocation invocation) {
		ServiceContext context = invocation.getContext();
		String ip = context.getClientInfo().get(FrameConst.CLIENT_IP);
		String serviceName = context.getServiceName();
		System.out.println("serviceName : " + serviceName);
		System.out.println("IP拦截 : " + ip);
		if ("192.168.1.1".equals(ip)) {
			return "IP非法!";
		} else {
			return invocation.process();
		}
	}
}

 

 

实现osmp-intf-define 定义的拦截器接口 ServiceInterceptor.java, 这里我们从ServiceInvocation里获取ServiceContext 上下文,并得到客户端信息。

 

从客户端信息里获取客户端IP 判断 客户端IP是否为 "192.168.1.1" 如果是的话我们返回IP非法,如果不是则执行请求并返回!

 

拦截器接口定义 ServiceInterceptor.java

 

/*   
 * Project: OSMP
 * FileName: ServiceInterceptor.java
 * version: V1.0
 */
package com.osmp.intf.define.interceptor;

/**
 * Description:拦截器
 * 所有基于osmp的拦截器都需要实现该接口,拦截器按作用域分为全局拦截器,BUNDLE拦截器,SERVICE拦截器三种类型。
 *        全局拦截器(ALL):      作用于osmp的所有BUNDLE和服务。
 *   BUNDLE拦截器(BUNDLE):     作用于osmp指定BUNDLE下的所有服务。
 * SERVICE拦截器(SERVICE):     作用于osmp指定的SERVICE服务。
 * 
 * 拦截器适用于 接口安全、权限校验、全局日志、调用链日志Track、特定服务AOP拦截等业务场景
 * 
 * 服务发布时,需要在service-properties 里指定拦截器的类型(type)和匹配的拦截策略(pattern)
 * 
 * <osgi:service interface="com.osmp.intf.define.interceptor.ServiceInterceptor" ref="osmp.demo.interceptor">
		<osgi:service-properties>
			<entry key="name" value="Interceptor_demo" />
			<entry key="mark" value="拦截器demo"/>
			<entry key="type" value="SERVICE"/> //type:ALL、BUNDLE、SERVICE
			<entry key="pattern" value="这里是发布的服务名称"/>  //支持正则匹配、   AAAService*  、  *AAA* 、   
		</osgi:service-properties>
	</osgi:service>
 * 
 * 拦截器与bundle、服务两种绑定方式:
 * 1、拦截器被安装时osmp-service组件进行bundle监听时,通过bundle获取interface service 后解析type和 pattern并注入到ServiceContainer中。
 * 2、通过osmp-web在线可以绑定和解绑拦截器与bundle、服务。
 * 
 * @author: wangkaiping
 * @date: 2016年8月9日 上午9:26:32上午10:51:30
 */
public interface ServiceInterceptor {
    Object invock(ServiceInvocation invocation);
}

 

 

ServiceInvocation定义了  ServiceContext getContext(); Object process(); 两个接口,

 

getContext()接口获取服务上下文,上下文包含了 请求客户端基本信息、请求参数、服务名称、及请求的url字符串等信息

 

process()请求执行接口,默认实现为,先从拦截器链里获取此服务对应的拦截器,如果拦截器链为空则直接执行BaseDataService的execture() 调用服务,如果不为空则执行调用拦截器链执行。

 

默认为 Invocation 实现 DefaultServiceInvocation.java

 

/*   
 * Project: OSMP
 * FileName: DefaultServiceInvocation.java
 * version: V1.0
 */
package com.osmp.http.tool;

import java.util.List;

import com.osmp.intf.define.interceptor.ServiceInterceptor;
import com.osmp.intf.define.interceptor.ServiceInvocation;
import com.osmp.intf.define.model.ServiceContext;
import com.osmp.intf.define.service.BaseDataService;

/**
 * 服务拦截器调用
 * @author heyu
 *
 */
public class DefaultServiceInvocation implements ServiceInvocation {
    private int currentInterceptorIndex = 0;
    private List<ServiceInterceptor> interceptorChain;
    private BaseDataService dataService;
    private ServiceContext context;
    private boolean isError = true;
    
    @Override
    public Object process() {
        if(interceptorChain == null || interceptorChain.isEmpty()){
            isError = false;
            return dataService.execute(context.getParameter());
        }
        if(currentInterceptorIndex == interceptorChain.size()){
            isError =false;
            return dataService.execute(context.getParameter());
        }
        ++currentInterceptorIndex;
        return interceptorChain.get(currentInterceptorIndex-1).invock(this);
    }

    public DefaultServiceInvocation(List<ServiceInterceptor> interceptorChain,
            BaseDataService dataService, ServiceContext context) {
        super();
        this.interceptorChain = interceptorChain;
        this.dataService = dataService;
        this.context = context;
    }

    @Override
    public ServiceContext getContext() {
        return context;
    }

    public boolean isError() {
        return isError;
    }
    

}

 

 

 

 

3、编写spirng配置文件 /src/main/resources/META-INF/spring/spirng-context.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:osgi="http://www.springframework.org/schema/osgi"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd">

	<context:component-scan base-package="com.osmp.demo.interceptor"></context:component-scan>

	<bean id="osmp.demo.interceptor" class="com.osmp.demo.interceptor.OsmpDemoInterceptor" />
	<osgi:service interface="com.osmp.intf.define.interceptor.ServiceInterceptor" ref="osmp.demo.interceptor">
		<osgi:service-properties>
			<entry key="name" value="Interceptor_demo" />
			<entry key="mark" value="拦截器demo"/>
			<entry key="type" value="ALL"/>
			<entry key="pattern" value=""/>
		</osgi:service-properties>
	</osgi:service>
	
</beans>

 

 

  • 将拦截器实现发布为服务
  • 服务属性包括 name、mark、type、pattern
  • name:拦截器名称
  • mark:拦截器注释 
  • type:拦截器类型(ALL:全局拦截   BUNDLE:bundle拦截器  SERVICE:服务拦截器)可以省略,默认为ALL 全局拦截
  • pattern:拦截匹配 (只有type 不为 ALL生效,可以省略 eg: 正则匹配、   AAAService*  、  *AAA* )

4、pom.xml 配置

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.osmp.baseweb</groupId>
		<artifactId>osmp-parent</artifactId>
		<version>1.0.0</version>
	</parent>

	<artifactId>osmp-interceptor-demo</artifactId>
	<packaging>bundle</packaging>
	<name>osmp-interceptor-demo</name>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
						<Export-Package></Export-Package>
						<Import-Package>
							*;resolution:=optional
						</Import-Package>
					</instructions>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<dependencies>
		<dependency>
			<groupId>com.osmp.baseweb</groupId>
			<artifactId>osmp-intf-define</artifactId>
			<version>${osmp.version}</version>
		</dependency>
	</dependencies>
</project>

 

5、打包部署 mvn install ,将打好的bundle包(osmp-interceptor-demo-1.0.0.jar)部署到servicemix里

 

 

6、将拦截器绑定,自动绑定、手动绑定两种方式:

  • 自动绑定:在将拦截器部署到servicemix的时候 osmp-service会监听拦截器接口服务,解析 typ、pattern进行自动绑定
  • 手动绑定:我们将拦截器部署后,如果没有添加type、pattern拦截器属性时,可以通过调用osmp-config提供的接口手动绑定。

 

 

 

 7、访问请求

 

 

 拦截器已经 生效,我们再停掉拦截器



 

再次访问



 

 正常返回请求

 

至此基于osmp的拦截器开发已经完成。

 

 

 

 

 

 

 

 

  • 大小: 32 KB
  • 大小: 48.7 KB
  • 大小: 12.3 KB
  • 大小: 24.7 KB
  • 大小: 5.3 KB
  • 大小: 28.1 KB
分享到:
评论

相关推荐

    Struts2 Felix1.4搭建OSGI web infrastructure Source

    4. **配置Struts2**:在OSGI bundle中,你需要提供一个或多个Struts2配置文件,定义Action、结果、拦截器等。由于OSGI环境,这些配置可能需要动态加载。 5. **部署和运行**:启动Felix容器,部署你的bundle。容器会...

    acegi-security-1.0.7-osgi.jar.zip

    它通过提供一系列可配置的拦截器和策略,使得安全控制能够无缝集成到Spring MVC和Spring事务管理中。 Acegi Security 1.0.7是该框架的一个特定版本,发布于2007年,包含了对当时已知问题的修复和改进。它支持多种...

    Felix+struts2做的web示例

    Struts2是一个流行的Java Web开发框架,它提供了MVC(模型-视图-控制器)架构来构建动态网站,具有强大的动作映射、拦截器和结果类型等功能。 描述中提到"参照网上的示例自己做的,主要是webapp这个bundle,可以...

    struts2学习笔记

    - 拦截器链:多个拦截器按照预设顺序组成一个链,每个拦截器都包含`pre_intercept`和`post_intercept`方法。 - 自定义拦截器:可以实现特定功能,如登录验证、性能监控等,只需实现`Interceptor`接口。 5. **...

    香锅之事前准备以及maven(老三卑微的愿望)

    标题中的“香锅之事前准备”可能是指编程过程中的准备工作,而“maven(老三卑微的愿望)”暗示了本话题将围绕Maven构建工具展开,Maven是Java项目管理的重要工具,常用于自动化构建、依赖管理和项目信息管理。...

    Felix 和 Struts2 开发 Web 应用

    首先,开发者可以将Struts2相关的组件,如Action、拦截器、结果类型等,打包成OSGi bundle,在Felix中进行部署。这样,Web应用的不同部分可以在需要时动态加载和卸载,提高了应用的扩展性和维护性。 在实际开发中,...

    Struts2中文手册PDF

    4. Interceptors(拦截器):拦截器是Struts2的重要特性,可以在Action调用前后插入自定义逻辑,如日志、权限验证等。 三、配置 1. struts.xml:主要配置文件,定义Action、结果类型、拦截器栈等。 2. 动态方法调用...

    Spring DM集成Strtus2(一)

    Struts2则是一个流行的Java MVC框架,它简化了创建Web应用的过程,提供了丰富的插件和拦截器机制,以及强大的Action类和结果映射,使得业务逻辑和视图分离。 集成Spring DM与Struts2的目的是为了充分利用两者的优势...

    struts2 模块包含

    2. **Interceptor拦截器**:拦截器是Struts2模块化设计中的重要组件,它们按预设顺序执行,可以处理通用的任务,如日志记录、权限检查等。通过在Action配置中声明不同的拦截器栈,可以实现不同模块的定制化处理。 3...

    struts2权威指南

    - Struts2的拦截器是其核心特性之一,它们按照预定义的顺序在Action调用前后执行,用于实现通用的功能,如日志记录、权限验证、数据转换等。 - 拦截器链可以自定义,通过配置文件或编程方式添加或删除拦截器。 3....

    struts.zip

    8. **OSGi兼容**:Struts 2设计为模块化,可以与OSGi容器集成,便于管理和部署。 在"李志明组struts版本"这个项目中,可能包含了以下组件和文件: - `struts.xml`:主要的配置文件,定义了Action、结果类型、拦截...

    java项目中任何技术所需要的包

    例如,对于Struts2,可能存在一些自定义拦截器或主题的JAR包,或者对于DWR,可能包含了一些自定义的转换器和安全相关的扩展。 总的来说,理解和掌握这些JAR包及其对应技术是Java开发中的基础,它们共同构成了Java...

    org.apache.felix.http.samples.filter-2.2.2.zip

    【标题】"org.apache.felix.http.samples.filter-2.2.2.zip" 是一个与Apache Felix框架相关的HTTP过滤器示例项目的压缩包。Apache Felix是一个流行的开源Java框架,它实现了OSGi(Open Service Gateway Initiative)...

    改进基于filter的远程分布式session存储

    Filter是Java Servlet规范的一部分,它允许开发者在请求处理前或处理后进行拦截和处理,例如在请求到达目标Servlet之前对Session进行操作。 基于Filter的远程分布式session存储改进可能包含以下方面: 1. **...

    shiro用户教程pdf

    Shiro提供了一些默认的拦截器,如`authc`(认证拦截器)、`perms`(权限拦截器)等,可以直接使用这些拦截器来简化开发过程。 ### 第九章:JSP标签 Shiro提供了一系列JSP标签,用于在Web应用中执行安全相关的操作...

    struts-2.1.8.1.rar

    1. **Struts 2框架**:Struts 2是MVC(Model-View-Controller)设计模式的一个实现,它整合了WebWork和Struts 1的优点,提供了强大的动作调度、拦截器、结果类型、国际化和异常处理等功能。Struts 2.1.8.1是该框架的...

    java调用插件代码.rar

    OSGi是一种强大的模块化系统,它管理类加载器,允许不同模块(bundle)之间的依赖关系,并动态地安装、卸载和更新这些模块。在OSGi环境中,插件被封装为独立的bundle,可以通过API来启动、停止或与其他bundle交互。...

    Struts2

    3. **Interceptor(拦截器)**:拦截器是Struts2的一个强大特性,它可以像过滤器一样在Action调用前后执行一些预处理和后处理操作。例如,登录检查、日志记录、事务管理等。拦截器链可以自定义配置,以满足不同的...

    Struts2-core-2.1.8.1.jar

    2. **拦截器(Interceptors)**:拦截器是Struts2的重要组成部分,它们在Action调用前后执行,可以实现事务管理、日志记录、性能监控等功能,提高了代码的可维护性和可扩展性。 3. **模板技术集成**:Struts2支持...

Global site tag (gtag.js) - Google Analytics