CXF 的IP拦截
非常久没有写技术文档了,今天 记录下Webserver的Ip限制吧
需求是:webserver接口能在内网訪问,可是測试平台的webserver要能够在外网訪问,这样就有了一点差别,
这个实现的比較简单配置文件就一个白名单
#可用的IP
whiteList=a;b;
表示一个内网网段都能够訪问
用配置文件读取
package com.onepiece.cxf.util; import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.ResourceBundle; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* 配置文件工具
*
* @author JueYue
* @date 2014年7月3日 下午5:06:35
*/
public class CxfInterceptorProperties { private static final Logger logger = LoggerFactory
.getLogger(CxfInterceptorProperties.class); private static boolean isNotIntercept = false; private static List<String> whiteList; static {
ResourceBundle bundle;
try {
bundle = ResourceBundle.getBundle("cxf-interceptor");
} catch (Exception e) {
logger.info("cxf-interceptor没有配置配置文件,使用缺省配置");
bundle = ResourceBundle
.getBundle("com/onepiece/cxf/util/cxf-interceptor");
}
whiteList = Arrays.asList(bundle.getString("whiteList").split(";"));
try {
Enumeration<NetworkInterface> netInterfaces = NetworkInterface
.getNetworkInterfaces();
String ip;
while (netInterfaces.hasMoreElements()) {
NetworkInterface nif = netInterfaces.nextElement();
Enumeration<InetAddress> iparray = nif.getInetAddresses();
while (iparray.hasMoreElements()) {
ip = iparray.nextElement().getHostAddress();
if (ip.contains("192.168.0")) {
logger.info("发现測试IP地址,取消IP限制");
isNotIntercept = true;
break;
}
logger.debug("本机IP为:{}",ip);
}
}
} catch (Exception e) {
logger.info("获取IP失败。默认启用拦截");
e.printStackTrace();
}
} public static List<String> getWhiteList() {
return whiteList;
} public static boolean isNotIntercept() {
return isNotIntercept;
} }
自己设置一个默认配置,可是測试平台的话就没有IP限制了,这里获取IP地址复杂点,由于可能存在多个IP所以都获取发现一下自己想要的IP地址
然后是IP拦截
package com.onepiece.cxf.address; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils;
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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.onepiece.cxf.util.CxfInterceptorProperties; /**
* 拦截配置文件的配置
*
* @author JueYue
* @date 2014年7月3日 下午5:05:46
*/
public class IpAddressInInterceptor extends AbstractPhaseInterceptor<Message> { private static final Logger logger = LoggerFactory
.getLogger(IpAddressInInterceptor.class); public IpAddressInInterceptor() {
super(Phase.RECEIVE);
} public void handleMessage(Message message) throws Fault {
HttpServletRequest request = (HttpServletRequest) message
.get(AbstractHTTPDestination.HTTP_REQUEST);
List<String> allowedList = CxfInterceptorProperties.getWhiteList();
if (logger.isDebugEnabled() && request != null) {
logger.debug("getRemoteAddr 获取的IP:{},X-Client-Address 获取的IP:{}",
request.getRemoteAddr(),request.getHeader("X-Client-Address"));
}
if (CxfInterceptorProperties.isNotIntercept() || request == null) {
return;
}
String ipAddress = getIP(request);
// 处理白名单
boolean contains = false;
for (String allowIpAddress : allowedList) {
if (ipAddress.startsWith(allowIpAddress)) {
contains = true;
break;
}
}
if (!contains) {
logger.warn("***********************发现一个外来IP,IP地址:" + ipAddress
+ "**************");
throw new Fault(new IllegalAccessException("IP address "
+ ipAddress + " is not allowed"));
}
} private String getIP(HttpServletRequest request) {
String IP = request.getHeader("X-Client-Address"); // 取clientIP地址
if (StringUtils.isEmpty(IP)) {
IP = request.getRemoteAddr();
}
return IP;
} }
这里获取IP首先是X-Clint-Address 由于我们是用的PortTunnel代理的,这个设置下就能够在X-cliet-Address获取真实IP
这样我们就做到了IP限制.后面就是配置下
<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:jaxws="http://cxf.apache.org/jaxws" xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"
default-autowire="byName"> <import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <!-- IP地址输入拦截器 -->
<bean id="ipAddressInInterceptor"
class="com.onepiece.cxf.address.IpAddressInInterceptor" />
<!-- 全局Bus(输入拦截器) -->
<cxf:bus>
<cxf:inInterceptors>
<ref bean="ipAddressInInterceptor"/>
</cxf:inInterceptors>
</cxf:bus> </beans>
使用的是全局设置,所以不用每一个都配置,这里须要注意一点default-lazy-init="true" 假设spring加上这个就会失效,
这里基本就完毕了IP限制了
CXF 的IP拦截的更多相关文章
- CXF实战之拦截器Interceptor(四)
拦截器(Interceptor)是CXF功能最基本的扩展点,能够在不正确核心模块进行改动的情况下.动态加入非常多功能.拦截器和JAX-WS Handler.Filter的功能相似,当服务被调用时.就会 ...
- WS之cxf的权限拦截器应用
一.服务器端: 1.权限判断: package cn.tdtk.ws.interceptor; import java.util.List; import org.apache.cxf.binding ...
- CXF对Interceptor拦截器的支持
前面在Axis中介绍过Axis的Handler,这里CXF的Interceptor就和Handler的功能类似.在每个请求响应之前或响应之后,做一些事情.这里的Interceptor就和Filter. ...
- 基于springmvc开发注解式ip拦截器
一.注解类 @Documented @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) ...
- cxf与struts2拦截器冲突的解决方案
最近学习接口,学习了下cxf,用tomcat部署访问的时候,发现接口不能访问:百度了很多,最终找到比较好的解决方案: sturts2配置: <!-- 设置strus拦截器 --> < ...
- (六)CXF之自定义拦截器
一.需求分析 客户端在调用服务端的方法时,需要进行用户名和密码验证.此时分为: 客户端请求的时候,要发送用户名密码到服务端 服务端检验用户名密码. 二.案例 前提:本章案例是基于前一章节的例子进一步讲 ...
- (五)CXF之添加拦截器
一.需求分析 webService中的拦截器类似于servlet的Filter过滤器.一般用于调用服务前后先调用拦截器的方法. 二.案例 本章案例是基于上一章节的基础上添加拦截器的 2.1 服务端添加 ...
- CXF之六 自定义拦截器
CXF已经内置了一些拦截器,这些拦截器大部分默认添加到拦截器链中,有些拦截器也可以手动添加,如手动添加CXF提供的日志拦截器.也可以自定义拦截器,CXF中实现自定义拦截器很简单,只要继承Abstrac ...
- Apache CXF自定义拦截器
为什么设计拦截器?1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了拦截器 拦截器分类: 1.按所处的位置分:服务器端拦截器,客户端拦截器. 2.按消息的方向分:入拦截器 ...
随机推荐
- 安装ngix
第一步:解压源码包 第二步:./configure -->这个时候会提示缺少PCRE 这个时候要安装yum -y install pcre-devel 第三步:./configure --> ...
- Android03-Activity生命周期及启动模式
1.返回栈概念 2.生命周期 1. onCreate() 这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动 第一次被创建的时候调用.你应该在这个方法中完成活动的初始化操作,比如 ...
- 元素“Button”不是已知元素。原因可能是网站中存在编译错误,或者缺少web.config文件
最近开发的时候ASP控件都有波浪下划线,提示不是已知元素,搞得挺郁闷的.虽然不影响变异,不过就是不爽. 折腾N久...... 解决了,把FramWork平台换成3.5,问题解决,不知道为啥,求大神指点 ...
- 通过jpegoptim批量压缩文件
#!/bin/sh filelist=$(ls) for file in $filelist do if [ -d $file ] then du -h $file /usr/local/bin/jp ...
- H.264视频的RTP荷载格式
Status of This Memo This document specifies an Internet standards track protocol for the Internet ...
- ubuntu连接无线网
我的ubuntu是因为没有安装无线网卡驱动,首先查看网卡型号 但是我在Broadcom官网上没有找到BCM43142的驱动. 通过谷歌后发现通过安装bcwl-kernel-source来解决这个问题, ...
- poj1503---大数加法
先讲一种错误的做法:WA了n次,大神一定帮我看一下//看到有说数组大小开到250,我改了之后还是不//思路是将arr这个数组的每一行附上输入的值,然后求每列所有数之和,当然进位 //maxlen记录这 ...
- nide.js(二)文件I/O
文件I/O fs模块的基本用法 node.js中提供一个名为fs的模块来支持I/O操作,fs模块的文件I/O是对标准POSIX函数的简单封装. 1.writeFile函数的基本用法 文件I/O,写入是 ...
- C#之多线程编程
一.进程与线程 进程(Process)是对一段静态指令序列(程序)的动态执行过程,是系统进行资源分配和调度的一个基本单位.与进程相关的信息包括进程的用户标识,正在执行的已经编译好的程序,进程程序和数据 ...
- Ubuntu自带的vi编辑器太难用了,换
由于Ubuntu预安装的是tiny版本,就会导致我们在使用上的产生不便.所以我们要安装vim的full版本. 首先,先卸掉旧版的vi,输入以下命令: sudo apt-get remove vim-c ...