使用CXF限制客户端IP地址

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

    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" />  

你可能感兴趣的:(apache,xml,servlet,webservice)