在Apaceh XML-RPC获取客户端的ip

       在项目中使用Apache XML-RPC时,有时候需要获得客户端的ip,以便于记录日志等,由于官方没有提供相应的方法,也没有对其做实现,所以需要手工修改源码来实现该功能。XML-RPC本身是一个Servlet,所以要获得调用者ip,可以在Servlet的调用入口处doGet或doPost方法中获取,获取到以后还需要将其存储起来,并提供一个接口供外部调用,可以考虑用ThreadLocal来存储,并提供一个public static的方法供外部调用获取ip。

      具体实现方法:

       下载与当前版本对应的源码,并将源码拷贝到项目src下面,同时删除lib下相应的jar包,最新的版本是3.1.3,下载地址是:http://labs.renren.com/apache-mirror//ws/xmlrpc/apache-xmlrpc-current-src.zip 。

      修改源码:

      找到org.apache.xmlrpc.webserver包下面的XmlRpcServlet类,在该类里面添加私有变量

view plain
  1. private static ThreadLocal clientIpAddress = new ThreadLocal();  


和供外部调用的接口

view plain
  1. public static String getClientIpAddress() {  
  2.         return (String) clientIpAddress.get();  
  3.     }  

在doPost方法里面,添加获取并设置ip的语句clientIpAddress.set(pRequest.getRemoteAddr());

view plain
  1. public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse) throws IOException, ServletException {  
  2.     clientIpAddress.set(pRequest.getRemoteAddr());  
  3.     server.execute(pRequest, pResponse);  
  4. }  


至此,就完成了,外部可通过调用XmlRpcServlet.getClientIpAddress()方法来获取IP了

附修改后的源码,版本不同可能有细微差异:

view plain
  1. /* 
  2.  * Copyright 1999,2005 The Apache Software Foundation. 
  3.  *  
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  *  
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  *  
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  */  
  16. package org.apache.xmlrpc.webserver;  
  17.   
  18. import java.io.IOException;  
  19. import java.lang.reflect.InvocationTargetException;  
  20. import java.net.URL;  
  21. import java.util.Enumeration;  
  22.   
  23. import javax.servlet.ServletConfig;  
  24. import javax.servlet.ServletException;  
  25. import javax.servlet.http.HttpServlet;  
  26. import javax.servlet.http.HttpServletRequest;  
  27. import javax.servlet.http.HttpServletResponse;  
  28.   
  29. import org.apache.commons.logging.Log;  
  30. import org.apache.commons.logging.LogFactory;  
  31. import org.apache.xmlrpc.XmlRpcConfig;  
  32. import org.apache.xmlrpc.XmlRpcException;  
  33. import org.apache.xmlrpc.common.TypeConverterFactory;  
  34. import org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping;  
  35. import org.apache.xmlrpc.server.PropertyHandlerMapping;  
  36. import org.apache.xmlrpc.server.RequestProcessorFactoryFactory;  
  37. import org.apache.xmlrpc.server.XmlRpcHandlerMapping;  
  38. import org.apache.xmlrpc.server.XmlRpcServer;  
  39. import org.apache.xmlrpc.util.ReflectionUtil;  
  40.   
  41.   
  42. /** 

    A default servlet implementation The typical use would 

  43.  * be to derive a subclass, which is overwriting at least the 
  44.  * method {@link #newXmlRpcHandlerMapping()}.

     
  45.  * 

    The servlet accepts the following init parameters: 

  46.  *    
  47.  *     NameDescription 
  48.  *     enabledForExtensionsSets the value 
  49.  *       {@link XmlRpcConfig#isEnabledForExtensions()} 
  50.  *       to true. 
  51.  *    
  52.  * 

     
  53.  */  
  54. public class XmlRpcServlet extends HttpServlet {  
  55.     private static final long serialVersionUID = 2348768267234L;  
  56.     private static final Log log = LogFactory.getLog(XmlRpcServlet.class);  
  57.     private XmlRpcServletServer server;  
  58.     private AbstractReflectiveHandlerMapping.AuthenticationHandler authenticationHandler;  
  59.     private RequestProcessorFactoryFactory requestProcessorFactoryFactory;  
  60.     private TypeConverterFactory typeConverterFactory;  
  61.     private static ThreadLocal clientIpAddress = new ThreadLocal();  
  62.       
  63.     /** Returns the servlets instance of {@link XmlRpcServletServer}.  
  64.      * @return The configurable instance of {@link XmlRpcServletServer}. 
  65.      */  
  66.     public XmlRpcServletServer getXmlRpcServletServer() {  
  67.         return server;  
  68.     }  
  69.   
  70.     public static String getClientIpAddress() {  
  71.         return (String) clientIpAddress.get();  
  72.     }  
  73.   
  74.     private void handleInitParameters(ServletConfig pConfig) throws ServletException {  
  75.         for (Enumeration en = pConfig.getInitParameterNames();  en.hasMoreElements();  ) {  
  76.             String name = (String) en.nextElement();  
  77.             String value = pConfig.getInitParameter(name);  
  78.             try {  
  79.                 if (!ReflectionUtil.setProperty(this, name, value)  
  80.                     &&  !ReflectionUtil.setProperty(server, name, value)  
  81.                     &&  !ReflectionUtil.setProperty(server.getConfig(), name, value)) {  
  82.                     throw new ServletException("Unknown init parameter " + name);  
  83.                 }  
  84.             } catch (IllegalAccessException e) {  
  85.                 throw new ServletException("Illegal access to instance of " + server.getClass().getName()  
  86.                         + " while setting property " + name + ": " + e.getMessage(), e);  
  87.             } catch (InvocationTargetException e) {  
  88.                 Throwable t = e.getTargetException();  
  89.                 throw new ServletException("Failed to invoke setter for property " + name  
  90.                         + " on instance of " + server.getClass().getName()  
  91.                         + ": " + t.getMessage(), t);  
  92.             }  
  93.         }  
  94.     }  
  95.   
  96.     public void init(ServletConfig pConfig) throws ServletException {  
  97.         super.init(pConfig);  
  98.         try {  
  99.             server = newXmlRpcServer(pConfig);  
  100.             handleInitParameters(pConfig);  
  101.             server.setHandlerMapping(newXmlRpcHandlerMapping());  
  102.         } catch (XmlRpcException e) {  
  103.             try {  
  104.                 log("Failed to create XmlRpcServer: " + e.getMessage(), e);  
  105.             } catch (Throwable ignore) {  
  106.             }  
  107.             throw new ServletException(e);  
  108.         }  
  109.     }  
  110.   
  111.     /** Sets the servlets {@link AbstractReflectiveHandlerMapping.AuthenticationHandler}. 
  112.      */  
  113.     public void setAuthenticationHandler(AbstractReflectiveHandlerMapping.AuthenticationHandler pHandler) {  
  114.         authenticationHandler = pHandler;  
  115.     }  
  116.   
  117.     /** Returns the servlets {@link AbstractReflectiveHandlerMapping.AuthenticationHandler}. 
  118.      */  
  119.     public AbstractReflectiveHandlerMapping.AuthenticationHandler getAuthenticationHandler() {  
  120.         return authenticationHandler;  
  121.     }  
  122.   
  123.     /** Sets the servlets {@link RequestProcessorFactoryFactory}. 
  124.      */  
  125.     public void setRequestProcessorFactoryFactory(RequestProcessorFactoryFactory pFactory) {  
  126.         requestProcessorFactoryFactory = pFactory;  
  127.     }  
  128.   
  129.     /** Returns the servlets {@link RequestProcessorFactoryFactory}. 
  130.      */  
  131.     public RequestProcessorFactoryFactory getRequestProcessorFactoryFactory() {  
  132.         return requestProcessorFactoryFactory;  
  133.     }  
  134.   
  135.     /** Sets the servlets {@link TypeConverterFactory}. 
  136.      */  
  137.     public void setTypeConverterFactory(TypeConverterFactory pFactory) {  
  138.         typeConverterFactory = pFactory;  
  139.     }  
  140.   
  141.     /** Returns the servlets {@link TypeConverterFactory}. 
  142.      */  
  143.     public TypeConverterFactory getTypeConverterFactory() {  
  144.         return typeConverterFactory;  
  145.     }  
  146.   
  147.     /** Creates a new instance of {@link XmlRpcServer}, 
  148.      * which is being used to process the requests. The default implementation 
  149.      * will simply invoke new {@link XmlRpcServer}. 
  150.      */  
  151.     protected XmlRpcServletServer newXmlRpcServer(ServletConfig pConfig)  
  152.             throws XmlRpcException {  
  153.         return new XmlRpcServletServer();  
  154.     }  
  155.   
  156.     /** Creates a new handler mapping. The default implementation loads 
  157.      * a property file from the resource 
  158.      * org/apache/xmlrpc/webserver/XmlRpcServlet.properties 
  159.      */  
  160.     protected XmlRpcHandlerMapping newXmlRpcHandlerMapping() throws XmlRpcException {  
  161.         URL url = XmlRpcServlet.class.getResource("XmlRpcServlet.properties");  
  162.         if (url == null) {  
  163.             throw new XmlRpcException("Failed to locate resource XmlRpcServlet.properties");  
  164.         }  
  165.         try {  
  166.             return newPropertyHandlerMapping(url);  
  167.         } catch (IOException e) {  
  168.             throw new XmlRpcException("Failed to load resource " + url + ": " + e.getMessage(), e);  
  169.         }  
  170.     }  
  171.   
  172.     /** Creates a new instance of {@link PropertyHandlerMapping} by 
  173.      * loading the property file from the given URL. Called from 
  174.      * {@link #newXmlRpcHandlerMapping()}. 
  175.      */  
  176.     protected PropertyHandlerMapping newPropertyHandlerMapping(URL url) throws IOException, XmlRpcException {  
  177.         PropertyHandlerMapping mapping = new PropertyHandlerMapping();  
  178.         mapping.setAuthenticationHandler(authenticationHandler);  
  179.         if (requestProcessorFactoryFactory != null) {  
  180.             mapping.setRequestProcessorFactoryFactory(requestProcessorFactoryFactory);  
  181.         }  
  182.         if (typeConverterFactory != null) {  
  183.             mapping.setTypeConverterFactory(typeConverterFactory);  
  184.         } else {  
  185.             mapping.setTypeConverterFactory(server.getTypeConverterFactory());  
  186.         }  
  187.         mapping.setVoidMethodEnabled(server.getConfig().isEnabledForExtensions());  
  188.         mapping.load(Thread.currentThread().getContextClassLoader(), url);  
  189.         return mapping;  
  190.     }  
  191.   
  192.     /** Creates a new instance of {@link org.apache.xmlrpc.webserver.RequestData} 
  193.      * for the request. 
  194.      */  
  195.     public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse) throws IOException, ServletException {  
  196. //      String ip = IPUtils.getIpAddr(pRequest);  
  197. //      System.out.println("RPC-XmlRpcServlet,clientIP: " + ip);  
  198.         clientIpAddress.set(pRequest.getRemoteAddr());  
  199.         server.execute(pRequest, pResponse);  
  200.     }  
  201.   
  202.     public void log(String pMessage, Throwable pThrowable) {  
  203.         log.error(pMessage, pThrowable);  
  204.     }  
  205.   
  206.     public void log(String pMessage) {  
  207.         log.info(pMessage);  
  208.     }  
  209. }  

你可能感兴趣的:(J2EE_XML,servlet,string,null,server,url,存储)