一、使用tomcat容器发布webservice
使用web容器发布webservice时,可以借助spring(spring集成了CXF)更方便发布。
1、修改pom.xml文件
<cxf.version>3.1.11</cxf.version>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
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
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
4、配置spring-core.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:endpoint id="material"
implementor="com.phome.proj.service.impl.MaterialServiceImpl"
address="/material"/>
</beans>
到这里,不带权限验证的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 文件
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
<role rolename="user_operator"/>
<user username="username" password="password_123" roles="user_operator"/>
</tomcat-users>
2、server端配置web.xml
<!--权限验证-->
<security-role>
<description>Normal operator user</description>
<role-name>user_operator</role-name>
</security-role>
<security-constraint>
<web-resource-collection>
<web-resource-name>Operator Roles Security</web-resource-name>
<url-pattern>/webservice/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user_operator</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
3、重启 tomcat,并重新发布webservice
4、效果
访问 http://localhost:8080/webservice/material?wsdl
三、编写客户端端调用webservice的方法,使用axis2
1、修改pom.xml
<!--WebSvc-->
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.xml.rpc</groupId>
<artifactId>javax.xml.rpc-api</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>commons-discovery</groupId>
<artifactId>commons-discovery</artifactId>
<version>0.2</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-api</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.schema</groupId>
<artifactId>XmlSchema</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-impl</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.neethi</groupId>
<artifactId>neethi</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-local</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-transport-http</artifactId>
<version>1.6.4</version>
<exclusions>
<exclusion>
<artifactId>httpcore</artifactId>
<groupId>org.apache.httpcomponents</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
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");
至此,大功告成!