使用CXF限制客户端IP地址

有的时候,对于WebService服务端,想配置白名单和黑名单的IP地址,允许白名单的IP地址请求,阻止黑名单的IP地址请求。
在CXF中,可以通过一个输入拦截器实现。

Java代码 
  1. import java.util.List;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. import org.apache.cxf.interceptor.Fault;  
  6. import org.apache.cxf.message.Message;  
  7. import org.apache.cxf.phase.AbstractPhaseInterceptor;  
  8. import org.apache.cxf.phase.Phase;  
  9. import org.apache.cxf.transport.http.AbstractHTTPDestination;  
  10.   
  11. /** 
  12.  * IP地址拦截器 
  13.  * 可在filter.xml文件中配置允许和拒绝访问的IP地址 
  14.  * @author Sunshine 
  15.  * 
  16.  */  
  17. public class IpAddressInInterceptor extends AbstractPhaseInterceptor<Message> {  
  18.   
  19.     public IpAddressInInterceptor() {  
  20.         super(Phase.RECEIVE);  
  21.     }  
  22.   
  23.     public void handleMessage(Message message) throws Fault {  
  24.         HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);  
  25.         // 通过一个IpAddressConfig对象,从XML文件中读取预先设置的允许和拒绝的IP地址,这些值也可以来自数据库  
  26.         IpAddressConfig config = IpAddressConfig.getInstance(); // 获取config实例  
  27.         List<String> allowedList = config.getAllowedList(); // 允许访问的IP地址  
  28.         List<String> deniedList = config.getDeniedList(); // 拒绝访问的IP地址  
  29.         String ipAddress = request.getRemoteAddr(); // 取客户端IP地址  
  30.         // 先处理拒绝访问的地址  
  31.         for (String deniedIpAddress : deniedList) {  
  32.             if (deniedIpAddress.equals(ipAddress)) {  
  33.                 throw new Fault(new IllegalAccessException("IP address " + ipAddress + " is denied"));  
  34.             }  
  35.         }  
  36.         // 如果允许访问的集合非空,继续处理,否则认为全部IP地址均合法  
  37.         if (allowedList.size() > 0) {  
  38.             boolean contains = false;  
  39.             for (String allowedIpAddress : allowedList) {  
  40.                 if (allowedIpAddress.equals(ipAddress)) {  
  41.                     contains = true;  
  42.                     break;  
  43.                 }  
  44.             }  
  45.             if (!contains) {  
  46.                 throw new Fault(new IllegalAccessException("IP address " + ipAddress + " is not allowed"));  
  47.             }  
  48.         }  
  49.     }  
  50.   
  51. }  

我的IP地址允许和阻止列表来自一个自定义的filter.xml文件,这个值也可以来自数据库。当显式抛出Fault异常的时候,这个请求即被阻止,否则放行。

在applicationContext-cxf.xml中要相应的定义这个IP地址拦截器,使之生效。

Xml代码 
  1. <!-- IP地址输入拦截器 -->  
  2. <bean id="ipAddressInInterceptor"  
  3.     class="com.yourcompany.ws.interceptor.IpAddressInInterceptor" />  
  4.   
  5. <!-- 用户名和密码输入拦截器 -->  
  6. <bean id="wss4jInInterceptor"  
  7.     class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">  
  8.     <property name="properties">  
  9.         <map>  
  10.             <entry key="action" value="UsernameToken Timestamp" />  
  11.             <entry key="passwordType" value="PasswordDigest" />  
  12.             <entry key="passwordCallbackRef"  
  13.                 value-ref="digestPasswordCallback" />  
  14.         </map>  
  15.     </property>  
  16. </bean>  
  17.   
  18. <!-- 密码回调 -->  
  19. <bean id="digestPasswordCallback"  
  20.     class="com.yourcompany.ws.handler.DigestPasswordCallback" />  
  21.   
  22. <!-- 全局Bus(输入拦截器) -->  
  23. <cxf:bus>  
  24.     <cxf:inInterceptors>  
  25.         <ref bean="ipAddressInInterceptor" />  
  26.         <ref bean="wss4jInInterceptor" />  
  27.     </cxf:inInterceptors>  
  28. </cxf:bus>  
  29.   
  30. <!-- WebService服务 -->  
  31. <jaxws:endpoint id="helloWorldServiceEP" address="/HelloWorldService">  
  32.     <jaxws:implementor ref="helloWorldService" />  
  33. </jaxws:endpoint>  
  34. <bean id="helloWorldService"  
  35.     class="com.yourcompany.ws.impl.HelloWorldServiceImpl" />  

转自:http://www.javaeye.com/topic/740678

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值