WebServices中使用cxf开发日志拦截器以及自定义拦截器

首先下载一个cxf实例,里面包含cxf的jar包。我下的是apache-cxf-2.5.9


1、为什么要设置拦截器?

为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器.


2、拦截器分类

1. 按所处的位置分:服务器端拦截器,客户端拦截器

2. 按消息的方向分:入拦截器,出拦截器

3. 按定义者分:系统拦截器,自定义拦截器

WebServices中使用cxf开发日志拦截器以及自定义拦截器


3、拦截器API

Interceptor(拦截器接口)

AbstractPhaseInterceptor(自定义拦截器从此继承)

LoggingInInterceptor(系统日志入拦截器类)

LoggingOutInterceptor(系统日志出拦截器类)


WebServices中使用cxf开发日志拦截器以及自定义拦截器


4、编写实现拦截器

• 使用日志拦截器,实现日志记录

– LoggingInInterceptor

– LoggingOutInterceptor

• 使用自定义拦截器,实现用户名与密码的检验

– 服务器端的in拦截器

– 客户端的out拦截器

– benjamin/123456



系统日志拦截器代码实现:

Server:

SEI:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. package com.wiseweb.ws;  
  2.   
  3. import javax.jws.WebMethod;  
  4. import javax.jws.WebService;  
  5.   
  6. /**  
  7.  * SEI  
  8.  * @author piqiu  
  9.  *  
  10.  */  
  11. @WebService  
  12. public interface HelloWS {  
  13.   
  14.     @WebMethod  
  15.     public String sayHello(String name) ;  
  16. }  

SEI的实现:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. package com.wiseweb.ws;  
  2.   
  3. import javax.jws.WebService;  
  4.   
  5. /**  
  6.  * SEI的实现  
  7.  * @author piqiu  
  8.  *  
  9.  */  
  10. @WebService  
  11. public class HelloWSImpl implements HelloWS {  
  12.   
  13.     @Override  
  14.     public String sayHello(String name) {  
  15.         System.out.println("server sayHello():" + name);  
  16.         return "Hello: " + name;  
  17.     }  
  18.   
  19. }  

ServerTest:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. package com.wiseweb.ws.server;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.xml.ws.Endpoint;  
  6.   
  7. import org.apache.cxf.interceptor.Interceptor;  
  8. import org.apache.cxf.interceptor.LoggingInInterceptor;  
  9. import org.apache.cxf.interceptor.LoggingOutInterceptor;  
  10. import org.apache.cxf.jaxws22.EndpointImpl;  
  11. import org.apache.cxf.message.Message;  
  12.   
  13. import com.wiseweb.ws.HelloWSImpl;  
  14.   
  15. /**  
  16.  * 发布webservice  
  17.  * @author piqiu  
  18.  *  
  19.  */  
  20. public class ServerTest {  
  21.   
  22.     public static void main(String[] args) {  
  23.         String address = "http://10.211.55.3:8888/day01_ws/hellows" ;  
  24.         Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl()) ;  
  25.         EndpointImpl endpointImpl = (EndpointImpl) endpoint ;  
  26.           
  27.         List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors() ;  
  28.         inInterceptors.add(new LoggingInInterceptor()) ;  
  29.           
  30.         List<Interceptor<? extends Message>> outInterceptors = endpointImpl.getOutInterceptors() ;  
  31.         outInterceptors.add(new LoggingOutInterceptor()) ;  
  32.           
  33.         System.out.println("发布webservice成功!");  
  34.     }  
  35. }  

Client:

把下载下来的apache-cxf-2.5.9的bin目录配置到系统环境变量的path中去,以便可以在cmd中执行bin中的bat文件

WebServices中使用cxf开发日志拦截器以及自定义拦截器


在cmd中输入wsdl2java SEI地址就可以生成客户端代码了,同样也可以使用wsimport命令。

项目截图:

WebServices中使用cxf开发日志拦截器以及自定义拦截器


ClientTest:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. package com.wiseweb.client;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.cxf.endpoint.Client;  
  6. import org.apache.cxf.frontend.ClientProxy;  
  7. import org.apache.cxf.interceptor.Interceptor;  
  8. import org.apache.cxf.interceptor.LoggingInInterceptor;  
  9. import org.apache.cxf.interceptor.LoggingOutInterceptor;  
  10. import org.apache.cxf.message.Message;  
  11.   
  12. import com.wiseweb.ws.HelloWS;  
  13. import com.wiseweb.ws.HelloWSImplService;  
  14.   
  15. public class ClientTest {  
  16.   
  17.     public static void main(String[] args) {  
  18.         HelloWSImplService helloWSImplService = new HelloWSImplService() ;  
  19.         HelloWS helloWS = helloWSImplService.getHelloWSImplPort() ;  
  20.           
  21.         Client client = ClientProxy.getClient(helloWS) ;  
  22.         List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors() ;  
  23.         outInterceptors.add(new LoggingOutInterceptor()) ;  
  24.           
  25.         List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors() ;  
  26.         inInterceptors.add(new LoggingInInterceptor()) ;  
  27.           
  28.         String result = helloWS.sayHello("benjaminwhx") ;  
  29.         System.out.println(result);  
  30.           
  31.     }  
  32. }  

运行结果Server端和Client端比较:

Client:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. 信息: Outbound Message  
  2. ---------------------------  
  3. ID: 1  
  4. Address: http://10.211.55.3:8888/day01_ws/hellows  
  5. Encoding: UTF-8  
  6. Content-Type: text/xml  
  7. Headers: {Accept=[*/*], SOAPAction=[""]}  
  8. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHello xmlns:ns2="http://ws.wiseweb.com/"><arg0>benjaminwhx</arg0></ns2:sayHello></soap:Body></soap:Envelope>  
  9. --------------------------------------  
  10. 三月 03, 2015 11:03:17 上午 org.apache.cxf.services.HelloWSImplService.HelloWSImplPort.HelloWS  
  11. 信息: Inbound Message  
  12. ----------------------------  
  13. ID: 1  
  14. Response-Code: 200  
  15. Encoding: UTF-8  
  16. Content-Type: text/xml;charset=UTF-8  
  17. Headers: {Content-Length=[224], content-type=[text/xml;charset=UTF-8], Server=[Jetty(7.5.4.v20111024)]}  
  18. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHelloResponse xmlns:ns2="http://ws.wiseweb.com/"><return>Hello: benjaminwhx</return></ns2:sayHelloResponse></soap:Body></soap:Envelope>  
  19. --------------------------------------  
  20. Hello: benjaminwhx  

Server:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. 发布webservice成功!  
  2. 三月 03, 2015 11:03:15 上午 org.apache.cxf.services.HelloWSImplService.HelloWSImplPort.HelloWS  
  3. 信息: Inbound Message  
  4. ----------------------------  
  5. ID: 1  
  6. Address: http://10.211.55.3:8888/day01_ws/hellows?wsdl  
  7. Encoding: UTF-8  
  8. Http-Method: GET  
  9. Content-Type: text/xml  
  10. Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], content-type=[text/xml], Host=[10.211.55.3:8888], Pragma=[no-cache], User-Agent=[Apache CXF 2.5.9]}  
  11. --------------------------------------  
  12. 三月 03, 2015 11:03:16 上午 org.apache.cxf.services.HelloWSImplService.HelloWSImplPort.HelloWS  
  13. 信息: Inbound Message  
  14. ----------------------------  
  15. ID: 2  
  16. Address: http://10.211.55.3:8888/day01_ws/hellows  
  17. Encoding: UTF-8  
  18. Http-Method: POST  
  19. Content-Type: text/xml; charset=UTF-8  
  20. Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[197], content-type=[text/xml; charset=UTF-8], Host=[10.211.55.3:8888], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 2.5.9]}  
  21. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHello xmlns:ns2="http://ws.wiseweb.com/"><arg0>benjaminwhx</arg0></ns2:sayHello></soap:Body></soap:Envelope>  
  22. --------------------------------------  
  23. server sayHello():benjaminwhx  
  24. 三月 03, 2015 11:03:17 上午 org.apache.cxf.services.HelloWSImplService.HelloWSImplPort.HelloWS  
  25. 信息: Outbound Message  
  26. ---------------------------  
  27. ID: 2  
  28. Encoding: UTF-8  
  29. Content-Type: text/xml  
  30. Headers: {}  
  31. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHelloResponse xmlns:ns2="http://ws.wiseweb.com/"><return>Hello: benjaminwhx</return></ns2:sayHelloResponse></soap:Body></soap:Envelope>  
  32. --------------------------------------  


自定义拦截器代码实现:

Server:

SEI和SEI实现都不做变动,增加一个interceptor:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. package com.wiseweb.ws.interceptor;  
  2.   
  3. import javax.xml.namespace.QName;  
  4.   
  5. import org.apache.cxf.binding.soap.SoapMessage;  
  6. import org.apache.cxf.headers.Header;  
  7. import org.apache.cxf.interceptor.Fault;  
  8. import org.apache.cxf.phase.AbstractPhaseInterceptor;  
  9. import org.apache.cxf.phase.Phase;  
  10. import org.w3c.dom.Element;  
  11.   
  12. public class CheckUserInterceptor extends AbstractPhaseInterceptor<SoapMessage>{  
  13.   
  14.     public CheckUserInterceptor() {  
  15.         super(Phase.PRE_PROTOCOL);  
  16.     }  
  17.   
  18.     @Override  
  19.     public void handleMessage(SoapMessage message) throws Fault {  
  20.         Header header = message.getHeader(new QName("wiseweb")) ;  
  21.         if(header != null) {  
  22.             Element element = (Element)header.getObject() ;  
  23.             String username = element.getElementsByTagName("username").item(0).getTextContent() ;  
  24.             String password = element.getElementsByTagName("password").item(0).getTextContent() ;  
  25.             if(username.equals("benjamin") && password.equals("123456")) {  
  26.                 System.out.println("用户名与密码正确,通过验证!");  
  27.                 return ;  
  28.             }else {  
  29.                 throw new Fault(new RuntimeException("请输入正确的用户名和密码!")) ;  
  30.             }  
  31.         }else {  
  32.             throw new Fault(new RuntimeException("请输入用户名和密码!")) ;  
  33.         }  
  34.     }  
  35.   
  36. }  

ServerTest:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. package com.wiseweb.ws.server;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.xml.ws.Endpoint;  
  6.   
  7. import org.apache.cxf.interceptor.Interceptor;  
  8. import org.apache.cxf.jaxws22.EndpointImpl;  
  9. import org.apache.cxf.message.Message;  
  10.   
  11. import com.wiseweb.ws.HelloWSImpl;  
  12. import com.wiseweb.ws.interceptor.CheckUserInterceptor;  
  13.   
  14. public class ServetTest2 {  
  15.   
  16.     public static void main(String[] args) {  
  17.         String address = "http://10.211.55.3:8888/day01_ws/hellows" ;  
  18.         Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl()) ;  
  19.         EndpointImpl endpointImpl = (EndpointImpl) endpoint ;  
  20.           
  21.         List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors() ;  
  22.         inInterceptors.add(new CheckUserInterceptor()) ;  
  23.           
  24.         System.out.println("发布webservice成功!");  
  25.     }  
  26. }  


Client:

通过构造方法传入要比较的用户名和密码:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. package com.wiseweb.client.interceptor;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.xml.namespace.QName;  
  6. import javax.xml.parsers.DocumentBuilder;  
  7. import javax.xml.parsers.DocumentBuilderFactory;  
  8. import javax.xml.parsers.ParserConfigurationException;  
  9.   
  10. import org.apache.cxf.binding.soap.SoapMessage;  
  11. import org.apache.cxf.headers.Header;  
  12. import org.apache.cxf.interceptor.Fault;  
  13. import org.apache.cxf.phase.AbstractPhaseInterceptor;  
  14. import org.apache.cxf.phase.Phase;  
  15. import org.w3c.dom.Document;  
  16. import org.w3c.dom.Element;  
  17.   
  18. public class AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage>{  
  19.   
  20.     private String username ;  
  21.     private String password ;  
  22.       
  23.     public AddUserInterceptor(String username, String password) {  
  24.         super(Phase.PRE_PROTOCOL);  
  25.         this.username = username ;  
  26.         this.password = password ;  
  27.     }  
  28.   
  29.     @Override  
  30.     public void handleMessage(SoapMessage message) throws Fault {  
  31.         List<Header> headers = message.getHeaders() ;  
  32.           
  33.         DocumentBuilder builder = null ;  
  34.         try {  
  35.             builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();  
  36.         } catch (ParserConfigurationException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.         Document document = builder.newDocument() ;  
  40.         Element root = document.createElement("wiseweb") ;  
  41.         Element username = document.createElement("username") ;  
  42.         username.setTextContent(this.username);  
  43.         Element password = document.createElement("password") ;  
  44.         password.setTextContent(this.password);  
  45.         root.appendChild(username) ;  
  46.         root.appendChild(password) ;  
  47.         headers.add(new Header(new QName("wiseweb"), root)) ;  
  48.     }  
  49.   
  50. }  

ClientTest:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. package com.wiseweb.client;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.cxf.endpoint.Client;  
  6. import org.apache.cxf.frontend.ClientProxy;  
  7. import org.apache.cxf.interceptor.Interceptor;  
  8. import org.apache.cxf.interceptor.LoggingInInterceptor;  
  9. import org.apache.cxf.interceptor.LoggingOutInterceptor;  
  10. import org.apache.cxf.message.Message;  
  11.   
  12. import com.wiseweb.client.interceptor.AddUserInterceptor;  
  13. import com.wiseweb.ws.HelloWS;  
  14. import com.wiseweb.ws.HelloWSImplService;  
  15.   
  16. public class ClientTest2 {  
  17.   
  18.     public static void main(String[] args) {  
  19.         HelloWSImplService helloWSImplService = new HelloWSImplService() ;  
  20.         HelloWS helloWS = helloWSImplService.getHelloWSImplPort() ;  
  21.           
  22.         Client client = ClientProxy.getClient(helloWS) ;  
  23.         List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors() ;  
  24.         outInterceptors.add(new AddUserInterceptor("benjamin", "123456")) ;  
  25.           
  26.         String result = helloWS.sayHello("benjaminwhx") ;  
  27.         System.out.println(result);  
  28.           
  29.     }  
  30. }  

运行结果Server和Client比较:

Server:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. 发布webservice成功!  
  2. 用户名与密码正确,通过验证!  
  3. server sayHello():benjaminwhx  


Client:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. Hello: benjaminwhx  


如果输入的用户名和密码不正确,运行结果为:

Server:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. org.apache.cxf.interceptor.Fault: 请输入正确的用户名和密码!  
  2.     at com.wiseweb.ws.interceptor.CheckUserInterceptor.handleMessage(CheckUserInterceptor.java:29)  
  3.     at com.wiseweb.ws.interceptor.CheckUserInterceptor.handleMessage(CheckUserInterceptor.java:1)  
  4.     at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)  
  5.     at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:122)  
  6.     at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:348)  
  7.     at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:312)  
  8.     at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72)  
  9.     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:943)  
  10.     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:879)  
  11.     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)  
  12.     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)  
  13.     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)  
  14.     at org.eclipse.jetty.server.Server.handle(Server.java:349)  
  15.     at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)  
  16.     at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:936)  
  17.     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:801)  
  18.     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:224)  
  19.     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:51)  
  20.     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)  
  21.     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)  
  22.     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)  
  23.     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)  
  24.     at java.lang.Thread.run(Thread.java:745)  
  25. Caused by: java.lang.RuntimeException: 请输入正确的用户名和密码!  
  26.     ... 23 more  


Client:

[html] view plain copy  print?WebServices中使用cxf开发日志拦截器以及自定义拦截器WebServices中使用cxf开发日志拦截器以及自定义拦截器
  1. Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: 请输入正确的用户名和密码!  
  2.     at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156)  
  3.     at com.sun.proxy.$Proxy25.sayHello(Unknown Source)  
  4.     at com.wiseweb.client.ClientTest2.main(ClientTest2.java:26)  
  5. Caused by: org.apache.cxf.binding.soap.SoapFault: 请输入正确的用户名和密码!  
  6.     at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:75)  
  7.     at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:46)  
  8.     at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:35)  
  9.     at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)  
  10.     at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:114)  
  11.     at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)  
  12.     at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)  
  13.     at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)  
  14.     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:801)  
  15.     at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1679)  
  16.     at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1517)  
  17.     at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1425)  
  18.     at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)  
  19.     at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:650)  
  20.     at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)  
  21.     at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)  
  22.     at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531)  
  23.     at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:462)  
  24.     at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:365)  
  25.     at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:318)  
  26.     at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:95)  
  27.     at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134)  
  28.     ... 2 more  

这样就可以有效的验证访客的身份。
上一篇:阿里云服务器租用价格表(2020年最新版)


下一篇:Android官方开发文档Training系列课程中文版:分享文件之获取文件信息