`

cxf中自定义拦截器限制IP

 
阅读更多
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" />
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics