cxf中自定义拦截器限制IP

标签: cxf 定义 限制 | 发表时间:2016-03-22 15:49 | 作者:
出处:http://jackyrong.iteye.com
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;

/**
 * IP地址拦截器
 * 可在filter.xml文件中配置允许和拒绝访问的IP地址
 * @author Sunshine
 *
 */
public class IpAddressInInterceptor extends AbstractPhaseInterceptor<Message> {

	public IpAddressInInterceptor() {
		super(Phase.RECEIVE);
	}

	public void handleMessage(Message message) throws Fault {
		HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);
		// 通过一个IpAddressConfig对象,从XML文件中读取预先设置的允许和拒绝的IP地址,这些值也可以来自数据库
		IpAddressConfig config = IpAddressConfig.getInstance(); // 获取config实例
		List<String> allowedList = config.getAllowedList(); // 允许访问的IP地址
		List<String> deniedList = config.getDeniedList(); // 拒绝访问的IP地址
		String ipAddress = request.getRemoteAddr(); // 取客户端IP地址
		// 先处理拒绝访问的地址
		for (String deniedIpAddress : deniedList) {
			if (deniedIpAddress.equals(ipAddress)) {
				throw new Fault(new IllegalAccessException("IP address " + ipAddress + " is denied"));
			}
		}
		// 如果允许访问的集合非空,继续处理,否则认为全部IP地址均合法
		if (allowedList.size() > 0) {
			boolean contains = false;
			for (String allowedIpAddress : allowedList) {
				if (allowedIpAddress.equals(ipAddress)) {
					contains = true;
					break;
				}
			}
			if (!contains) {
				throw new Fault(new IllegalAccessException("IP address " + ipAddress + " is not allowed"));
			}
		}
	}

}


IP地址允许和阻止列表来自一个自定义的filter.xml文件,这个值也可以来自数据库。当显式抛出Fault异常的时候,这个请求即被阻止,否则放行。
在applicationContext-cxf.xml中要相应的定义这个IP地址拦截器,使之生效。
<!-- IP地址输入拦截器 -->
<bean id="ipAddressInInterceptor"
	class="com.yourcompany.ws.interceptor.IpAddressInInterceptor" />

<!-- 用户名和密码输入拦截器 -->
<bean id="wss4jInInterceptor"
	class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
	<property name="properties">
		<map>
			<entry key="action" value="UsernameToken Timestamp" />
			<entry key="passwordType" value="PasswordDigest" />
			<entry key="passwordCallbackRef"
				value-ref="digestPasswordCallback" />
		</map>
	</property>
</bean>

<!-- 密码回调 -->
<bean id="digestPasswordCallback"
	class="com.yourcompany.ws.handler.DigestPasswordCallback" />

<!-- 全局Bus(输入拦截器) -->
<cxf:bus>
	<cxf:inInterceptors>
		<ref bean="ipAddressInInterceptor" />
		<ref bean="wss4jInInterceptor" />
	</cxf:inInterceptors>
</cxf:bus>

<!-- WebService服务 -->
<jaxws:endpoint id="helloWorldServiceEP" address="/HelloWorldService">
	<jaxws:implementor ref="helloWorldService" />
</jaxws:endpoint>
<bean id="helloWorldService"
	class="com.yourcompany.ws.impl.HelloWorldServiceImpl" />


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [cxf 定义 限制] 推荐:

cxf中自定义拦截器限制IP

- - jackyrong
// 通过一个IpAddressConfig对象,从XML文件中读取预先设置的允许和拒绝的IP地址,这些值也可以来自数据库. IpAddressConfig config = IpAddressConfig.getInstance(); // 获取config实例. List allowedList = config.getAllowedList(); // 允许访问的IP地址.

WebService之JAX-WS、CXF、Spring3.0+

- - 博客园_首页
          面对工作的需要,web服务这一块一直都在身边转悠着. 既然工作中需要这些,作为程序员就应该去了解和学习. 下面主要简述采用CXF+Spring+JAX-WS来发布WebService服务,以及创建客户端调用服务.          1、先了解关于WebService的相关概念以及一些专有名词的解释:.

webservice编程基础—cxf

- - ITeye博客
最近研究了一下cxf的使用,主要的步骤如下:. 下载最新的cxf包apache-cxf-2.6.2.tar.zip,并解压,有一个lib文件,里面的jar包,就是webservice需要的(不完全需要,看你的应用,但是懒的分),加载进你的webservice的工程即可. 配置两个配置文件,为beans.xml和web.xml,内容如下:.

Hessian, CXF, Spring httpinvoke 对比

- - Java - 编程语言 - ITeye博客
做了一个 Hessian, CXF, Spring httpinvoke 速度对比. 时间消耗  cxf > spring httpinvoke > hessian. 并发为10, 调用1W次所耗时间. 当然, 都知道 cxf 和 hessian 实现以及应用场景不太一样, 但差这么多还是很意外的.

CXF WEBSERVICE 安全验证

- - 企业架构 - ITeye博客
CXF 封装的接口,不希望对外暴露 WSDL结构,找到的CXF安全认证技术都是基于拦截器,在调用的时候返回认证错误信息, 不能保护WSDL不被看到,后来看到别人的一个实现方式最简单有效,基于URL拦截的安全保护,用FILTER. 现在把这2种安全保护都记录下来,备用. 参考: http://www.myexception.cn/open-source/1505475.html.

cxf + spring 的WS Security示例

- - RSS - IT博客云
WSPasswordCallback的 passwordType属性和 password属性都为null,你只能获得用户名(identifier),一般这里的逻辑是使用这个用户名到数据库中查询其密码,然后再设置到 password属性,WSS4J会自动比较客户端传来的值和你设置的这个值. 你可能会问为什么这里CXF不把客户端提交的密码传入让我们在 ServerPasswordCallbackHandler中比较呢.

CXF 入门:HelloWorld接口发布

- - ITeye博客
第一步:在myeclipse中新建一个web项目名为myWs,. 并导入依赖的jar包(cxf,spring,apache-commons相关). cxf结合spring时所需jar包,此例子也需要这些,用到了spring上下文加载. 第二步:在WEB-INF中创建基本的cxf-beans.xml内容如下(作用:主要做webservice接口属性配置,通过web.xml配置加载,文件名和位置可以顺便,web.xml配置会用到).

CXF+JAXB处理复杂数据

- - 博客园_首页
CXF+JAXB处理复杂数据. JAXB 来实现对象和XML之间的映射. 前面的例子 中,使用CXF发布的Webservice,其方法的参数和返回值都是简单类型. 本文讨论对象复杂性的分级,验证对于各种复杂度JAXB的支持情况,以及使用JAXB时对于Map,循环引用,继承等情况的处理办法. 文中的例子没有直接调用JAXB的API,而是用CXF发布webservice的形式验证对象到xml的marshal和unmarshal, 所以本文也可以作为使用CXF的参考资料.

webService学习之cxf与spring的简单整合

- - 企业架构 - ITeye博客
一:先把cxf的jar包导进去,我是直接在官网下载的cxf的包,解压后直接把lib文件夹里的jar一次.    性全部丢进去了,因为在学习,还不知道哪些包要哪些包不要的,所以干脆直接放进去. . . .

CXF中jaxb-api.jar、jaxws-api.jar与jdk1.6不兼容问题

- - ITeye博客
服务器是tomcat6,在cxf-2.3.10中的:jaxb-api-2.2.3.jar jaxb-impl-2.2.4-1.jar 在jdk1.6中不兼容的问题,报错如下:. 原因是:需要jaxb 2.1,却加载了2.0,因为jdk1.6自带jaxb 2.0造成的,解决的办法是在D:\tomcat6下加入endorsed文件夹,.