2019独角兽企业重金招聘Python工程师标准>>>
一、使用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
三、编写客户端端调用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)本例使用火狐浏览器导出网站证书
(2):然后根据导出的文件生成.trustStore 文件
keytool -import -file d:/bjp2p.com.cn.crt(导出的证书的地址) -storepass 123456(密码) -keystore d:/crtTrust.trustStore(生成文件的地址)
(3)调用代码中增加
System.setProperty("javax.net.ssl.trustStore","D:/crtTrust.trustStore"); System.setProperty("javax.net.ssl.trustStorePassword", "123456");
至此,大功告成!