CXF发布webService、tomcat用户验证、axis2(http/https)调用服务

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 

一、使用tomcat容器发布webservice

使用web容器发布webservice时,可以借助spring(spring集成了CXF)更方便发布。

1、修改pom.xml文件

3.1.11

            org.apache.cxf
            cxf-rt-frontend-jaxws
            ${cxf.version}
 
 
           org.apache.cxf
           cxf-rt-transports-http
           ${cxf.version}
 

2、编写接口服务类、实现类

import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(targetNamespace="http://impl.service.proj.phome.com/")
public interface MaterialService {
    String addMaterial(@WebParam(name = "xmlData",targetNamespace="http://impl.service.proj.phome.com/")String xmlData);
}




import com.phome.proj.service.MaterialService;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(endpointInterface= "com.phome.proj.service.MaterialService",serviceName="material",
        targetNamespace="http://impl.service.proj.phome.com/")
public class MaterialServiceImpl implements MaterialService {
    @Override
    public String addMaterial(@WebParam(name = "xmlData",targetNamespace="http://impl.service.proj.phome.com/") String xmlData) {
        jsonObject.put("code","0");
        jsonObject.put("message", "success");
        return jsonObject.toString();
    }

3、配置web.xml

  
    CXFServlet
    
      org.apache.cxf.transport.servlet.CXFServlet
    
    1
  

  
    CXFServlet
    /webservice/*
  

4、配置spring-core.xml



    
    

到这里,不带权限验证的webservice可以发布成功

5、遇到以下错误解决方式

(1)Webservice调用服务端 Unmarshalling Error: unexpected element (Xxx). Expected elements are Xxx

在Webservice服务端方法参数前面加上命名空间,

@WebParam(name = "xmlData",  targetNamespace="http://impl.service.proj.phome.com/")

(2) webservice报org.apache.axis2.AxisFault: Transport error: 302)

设置外部访问该service方法不需要登录系统验证(因为没登录存在请求重定向的问题,进而导致的这个错误)

 

二、配置权限验证

在网上找了一堆soap header验证,没有成功,然后换了一种方式:在 tomcat的配置文件中添加用户角色和用户信息

1、tomcat配置用户角色及用户信息。

我这里是 tomcat8, 找到 Tomcat 8.0\conf目录下的 tomcat-users.xml 文件



  
   

2、server端配置web.xml


  
    Normal operator user
    user_operator
  
  
    
      Operator Roles Security
      /webservice/*
    
    
      user_operator
    
    
      NONE
    
  
  
    BASIC
  

3、重启 tomcat,并重新发布webservice

4、效果

访问 http://localhost:8080/webservice/material?wsdl

CXF发布webService、tomcat用户验证、axis2(http/https)调用服务_第1张图片

 

三、编写客户端端调用webservice的方法,使用axis2

1、修改pom.xml



    org.apache.axis2
    axis2
    1.6.2


    org.apache.axis
    axis
    1.4


    javax.xml.rpc
    javax.xml.rpc-api
    1.1.1


    javax.xml
    jaxrpc-api
    1.1


    commons-discovery
    commons-discovery
    0.2


    wsdl4j
    wsdl4j
    1.6.2


    org.apache.ws.commons.axiom
    axiom-api
    1.2.17


    org.apache.ws.commons.schema
    XmlSchema
    1.4.7


    org.apache.ws.commons.axiom
    axiom-impl
    1.2.17


    org.apache.neethi
    neethi
    3.0.3


    org.apache.axis2
    axis2-transport-local
    1.6.4


    org.apache.axis2
    axis2-transport-http
    1.6.4
    
        
            httpcore
            org.apache.httpcomponents
        
    


    javax.mail
    mail
    1.4.7

2、代码

public void reqServer(){
        String url = "http://localhost:8080/webservice/material?wsdl";
        try {
            Options options = new Options();
            options.setTo(new EndpointReference(url));
            options.setAction("");
            ServiceClient sender = new ServiceClient();
            sender.setOptions(options);
            OMFactory fac = OMAbstractFactory.getOMFactory();
            OMNamespace omNs = fac.createOMNamespace("http://impl.service.proj.phome.com/","");
            OMElement method = fac.createOMElement("addMaterial",omNs);
            OMElement value = fac.createOMElement("xmlData", omNs);
            HttpTransportProperties.Authenticator authenticator = new 
            HttpTransportProperties.Authenticator();
            options.setProperty(HTTPConstants.AUTHENTICATE,authenticator);
            authenticator.setUsername("username");
            authenticator.setPassword("password_123");
            value.setText("xxxxx");
            method.addChild(value);
            method.build();
            OMElement response = sender.sendReceive(method);
            String result = response.getFirstElement().getText();
            JSONObject jsonObject = JSONObject.parseObject(result);
            if("0".equals(jsonObject.get("code"))){
                System.out.println("req success");
            }else {
                System.out.println("req fail , resoon : " + jsonObject.get("message"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3、如果服务器接口采用https的方式请求,增加以下步骤

  (1)本例使用火狐浏览器导出网站证书

CXF发布webService、tomcat用户验证、axis2(http/https)调用服务_第2张图片

CXF发布webService、tomcat用户验证、axis2(http/https)调用服务_第3张图片

CXF发布webService、tomcat用户验证、axis2(http/https)调用服务_第4张图片

(2):然后根据导出的文件生成.trustStore 文件

keytool -import -file d:/bjp2p.com.cn.crt(导出的证书的地址) -storepass 123456(密码) -keystore  d:/crtTrust.trustStore(生成文件的地址)

CXF发布webService、tomcat用户验证、axis2(http/https)调用服务_第5张图片

CXF发布webService、tomcat用户验证、axis2(http/https)调用服务_第6张图片

(3)调用代码中增加

System.setProperty("javax.net.ssl.trustStore","D:/crtTrust.trustStore");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");

CXF发布webService、tomcat用户验证、axis2(http/https)调用服务_第7张图片

至此,大功告成!

转载于:https://my.oschina.net/ygzqhj/blog/897305

你可能感兴趣的:(CXF发布webService、tomcat用户验证、axis2(http/https)调用服务)